Привязка данных к списку WPF ListBox в ответ на вызов службы WCF

2

Изображение, если хотите, приложение WPF Visual Studio 2008 с одним окном, содержащим ListBox. Это приложение содержит описанный ниже метод, который связывает ListBox с содержимым таблицы базы данных.

Это приложение также выполняет контракт с WFC-сервисом, на котором размещается упомянутая служба WCF.

Ниже приведен метод привязки данных, вызываемый как нажатием кнопки в окне, так и в ответ на метод, который удаленно вызывается против службы WCF, размещенной приложением.

При вызове кнопки нажмите ссылку, которая работает правильно, и поле списка отражает содержимое таблицы базы данных. Я могу вставить некоторые записи в базовую таблицу, нажать кнопку, и содержимое окна списка обновится, чтобы отразить новые записи. Однако при удаленном удалении через службу WCF любые изменения в базе данных не отображаются в списке. После перехода по коду набор данных содержит правильный вид таблицы, но в окне списка сохраняется предыдущее представление таблицы и не отражается на содержимом набора данных.

Первоначально я думал, что это звучит как проблема с потоками, поэтому я попытался использовать объекты Dispatcher, но безрезультатно. Из моих исследований оба вызова получены в нити пользовательского интерфейса в любом случае.

Любые предложения оценены - возможно, что-то ослепительно очевидное, зная мою удачу...

    private void BindData()
    {
        SqlConnection connection;

        using (connection = new SqlConnection(CONNECTION_STRING))
        {
            DataSet dtSet = new DataSet();
            SqlCommand command = new SqlCommand("SELECT * FROM TheTableWithMyStuffIn", connection);
            SqlDataAdapter adapter = new SqlDataAdapter();
            connection.Open();
            adapter.SelectCommand = command;
            adapter.Fill(dtSet, "TheTableWithMyStuffIn");
            listBox1.DataContext = dtSet;
        }
    }

ОБНОВЛЕНИЕ: Я повторно реализовал механизм удаленного уведомления для использования удаленного доступа, а не WCF, и привязка данных теперь работает при вызове как удаленно, так и локально. Должно быть какое-то контекстуальное значение использования WCF?

Теги:
wpf
data-binding
wcf

3 ответа

2

Вы пытались проверить Service Trace Viewer, который поставляется с .Net 3/.Net 3.5/Windows SDK?

Возможно, стоит проверить сообщения, которые подпрыгивают, посмотреть, есть ли там что-то.

Удачи.

ИЗМЕНИТЬ

Возможно, вы захотите попробовать эту статью об обнаружении ошибок передачи данных без ошибок...

  • 0
    Cheers Kieron - эта статья об ошибках тихого связывания данных выглядит очень интересной в контексте моей проблемы. У меня есть решение, работающее с удаленным взаимодействием, но я вернусь к нему в течение следующих нескольких дней, чтобы понять, почему он не работает с WCF в качестве механизма IPC.
  • 0
    np, держите нас в курсе. Будет интересно посмотреть, в чем проблема.
Показать ещё 2 комментария
0

Я не уверен, что DataSet реализует соответствующие интерфейсы, чтобы автоматически обновлять окно списка WPF, но при условии, что это так, попробуйте это: вместо создания нового DataSet и назначения его в список, попробуйте повторно заполнить тот же самый экземпляр из базы данных. Если бы я писал это, я бы, вероятно, использовал поле ObservableCollection<T>, а не DataSet, но это означает, что вам нужно будет переместить ваши данные в DTO или сущность.

  • 0
    Ура дама. Я уже пробовал перерабатывать набор данных безрезультатно. Странно то, что это прекрасно работает в ответ на нажатие кнопки, только когда оно вызывается в контексте метода WCF, оно не работает. В какой-то момент данные будут перемещены в модель сущности - приведенный выше код является лишь упрощением с целью иллюстрации проблемы. В любом случае, это может стоить того, чтобы надеяться, что это решит проблему, но мой внутренний фанат должен знать, почему это не работает.
0

Я, вероятно, совершенно вне лучи здесь, учитывая, что я не имел ничего общего с .NET в течение многих лет, но никто еще не предложил ответа до сих пор, так что здесь.

Из быстрого сканирования документации MSDN о том, как привязка данных реализована в среде .NET, возникает впечатление, что обновления элементов управления зависят от событий, которые запускаются при изменении свойств связанного источника данных. Я заметил, что в представленном коде свойство DataContext для ListBox имеет новый DataSet, назначенный ему после того, как данные были получены с помощью метода Fill.

Может быть, с уже полученными данными какое-то событие, которое должно заставить ListBox реализовать обновленные данные, происходит слишком скоро? Можно было бы предположить, что настройка свойства DataContext будет достаточной, чтобы заставить его обновляться; но, учитывая, что за кулисами фреймворка, похоже, очень много сантехники, и что ListBox успешно обновляется при изменении в другом контексте, я бы начал подозревать простую абстракцию: то есть, хотя что-то работает как и ожидалось при использовании в одном случае, он терпит неудачу при использовании по-другому, потому что базовая сантехника (хотя и не обязательно ошибочная) отличается.

Возможно, присвоение свойства DataContext до заполнения DataSet будет иметь значение. Или, может быть, это просто поверхностно разумная догадка, но полностью и, очевидно, неправильная, и служит только для того, чтобы предать моему почти полному отсутствию знаний о встроенных .NET.

В любом случае, удачи: -)

  • 0
    Большое спасибо за ответ Ника. Я попытался перетасовать заказ, как вы предложили, а затем попробовал различные способы утилизации DataSet, но все равно не повезло.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню