Изображение, если хотите, приложение 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?
Вы пытались проверить Service Trace Viewer, который поставляется с .Net 3/.Net 3.5/Windows SDK?
Возможно, стоит проверить сообщения, которые подпрыгивают, посмотреть, есть ли там что-то.
Удачи.
ИЗМЕНИТЬ
Возможно, вы захотите попробовать эту статью об обнаружении ошибок передачи данных без ошибок...
Я не уверен, что DataSet
реализует соответствующие интерфейсы, чтобы автоматически обновлять окно списка WPF, но при условии, что это так, попробуйте это: вместо создания нового DataSet
и назначения его в список, попробуйте повторно заполнить тот же самый экземпляр из базы данных. Если бы я писал это, я бы, вероятно, использовал поле ObservableCollection<T>
, а не DataSet
, но это означает, что вам нужно будет переместить ваши данные в DTO или сущность.
Я, вероятно, совершенно вне лучи здесь, учитывая, что я не имел ничего общего с .NET в течение многих лет, но никто еще не предложил ответа до сих пор, так что здесь.
Из быстрого сканирования документации MSDN о том, как привязка данных реализована в среде .NET, возникает впечатление, что обновления элементов управления зависят от событий, которые запускаются при изменении свойств связанного источника данных. Я заметил, что в представленном коде свойство DataContext
для ListBox
имеет новый DataSet
, назначенный ему после того, как данные были получены с помощью метода Fill
.
Может быть, с уже полученными данными какое-то событие, которое должно заставить ListBox
реализовать обновленные данные, происходит слишком скоро? Можно было бы предположить, что настройка свойства DataContext
будет достаточной, чтобы заставить его обновляться; но, учитывая, что за кулисами фреймворка, похоже, очень много сантехники, и что ListBox
успешно обновляется при изменении в другом контексте, я бы начал подозревать простую абстракцию: то есть, хотя что-то работает как и ожидалось при использовании в одном случае, он терпит неудачу при использовании по-другому, потому что базовая сантехника (хотя и не обязательно ошибочная) отличается.
Возможно, присвоение свойства DataContext
до заполнения DataSet
будет иметь значение. Или, может быть, это просто поверхностно разумная догадка, но полностью и, очевидно, неправильная, и служит только для того, чтобы предать моему почти полному отсутствию знаний о встроенных .NET.
В любом случае, удачи: -)