Привязка данных к списку WPF ListBox в ответ на вызов службы WCF - PullRequest
2 голосов
/ 19 июля 2009

Изображение, если хотите, 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?

Ответы [ 3 ]

2 голосов
/ 21 июля 2009

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

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

Удачи.

EDIT

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

0 голосов
/ 20 июля 2009

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

0 голосов
/ 20 июля 2009

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

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

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

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

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

...