Member 13940788 Ответов: 2

Как обновить пользовательский интерфейс WPF(MVVM) из метода обратного вызова WCF


Всем привет,

Я использую дуплексную связь wcf в своем проекте и реализовал метод обратного вызова в своей Viewmodel. Данные поступают в мою viewmodel, но они не добавляются к наблюдаемой коллекции. он всегда показывает счет заднице ноль.

Application.Current.Dispatcher.BeginInvoke(
 new Action(() =>
 {
     FromCallBack = new LogEvents()
     {
         DateAndTime = DateTime.Now.ToString()
     };
     clctionlogs.Add(FromCallBack);

 }));


Что я уже пробовал:

Я пробовал использовать концепции потоковой передачи Dispatcher и SendOrPostCallback, но все равно данные не добавляются в коллекцию.

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

TABiSH777

Привет, это действительно трудно ответить вам из деталей, которые вы предоставили, но могут быть следующие проблемы,
1) пожалуйста, проверьте имена и их условность, а также добавляете ли вы их в одну коллекцию или нет.
2) пожалуйста, проверьте, инициализируете ли вы эту наблюдаемую коллекцию или нет, иначе она может давать ссылку на объект... ошибка.

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

2 Ответов

Рейтинг:
2

Graeme_Grant

Это трудно сказать из опубликованного кода, но распространенная ошибка, которая нарушает привязку данных, заключается в том, чтобы повторно инициализировать ObservableCollection, а не очищать его после установки привязки данных.

Так что ошибка в том, чтобы сделать это:

public class MyViewModel
{
    public ObservableCollection<string> Messages { get; }

    public MyViewModel()
    {
        Messages = new ObservableCollection<string>();
    }

    public void GetData()
    {
        Messages = new ObservableCollection<string>();  // mistake
        //Retrieve data code goes here...
    }
}

Правильный метод заключается в следующем:
public class MyViewModel
{
    public ObservableCollection<string> Messages { get; }

    public MyViewModel()
    {
        Messages = new ObservableCollection<string>();
    }

    public void GetData()
    {
        Messages.Clear(); // correct
        //Retrieve data code goes here...
    }
}


Member 13940788

Забыть обо всем. Данные, поступающие из метода обратного вызова wcf(duplex service) (который реализован на стороне клиента, находящегося внутри моей ViewModel), не привязаны к пользовательскому интерфейсу.

Graeme_Grant

Видите ли вы какие-либо ошибки привязки данных в окне вывода?

Отсюда мы не можем видеть ваш проект на экране...

Код в вашем вопросе не показывает никакого Xaml, как вы подключаете ViewModel к DataContext, какой класс коллекции вы используете, как вы заполняете саму коллекцию, а также как вы реализуете модель для хранения данных в коллекции.

Пожалуйста, обновите свой вопрос с дополнительной информацией, пожалуйста.

Рейтинг:
0

Dirk Bahle

Привет,

вам нужно убедиться, что ваша привязка работает правильно - для этого посмотрите на окно вывода - есть ли там Ошибка BindingExpression что вам может понадобиться исправить?

Если это не так, просмотрите свою привязку в элементе управления пользовательским интерфейсом, например. Список должен выглядеть примерно так:

<ListBox ItemsSource="{Binding WCFItemsList}"/>


где WCFItemsList должна быть вашей реализацией наблюдаемой коллекции в связанной модели представления:

public property ObservableCollection<MyWCFItems> WCFItemsList
{
  get
  {
    return _WCFItemsList;
  }
}


Помимо этого, вы также должны протестировать точки останова отладчика в viewmodel, чтобы убедиться, что ваша наблюдаемая коллекция загружена правильно.

Возможно, вы не видите счетчик в пользовательском интерфейсе, потому что он не является свойством INotifyPropertyChanged?

Его действительно трудно сказать что-то конкретное, так как вы не даете никакого полезного образца исходного кода, но я надеюсь, что эти контрольные точки помогут вам исследовать эту проблему ...


Member 13940788

Вот моя наблюдаемая коллекция

public ObservableCollection<logevnts> ClctionEventLogs
{
получить
{
вернуться _collectionEventLogs;
}
набор
{
_collectionEventLogs = значение;
On Свойство Changed("ClctionEventLogs");
}

}

Graeme_Grant

Нет необходимости реализовывать INotifyPropertyChanged для ObservableCollection, поскольку он реализует ICollectionChanged внутренне.

Dirk Bahle

Я только имел в виду, что INotifyPropertyChanged необходим, если вы хотите отобразить счетчик в пользовательском интерфейсе. Но это всего лишь догадка, так как приведенный пример кода не показывает, что было опробовано до сих пор ...

Graeme_Grant

Нет, вам это не нужно, так как Count свойство является внутренним для ObservableCollection класс. Если вы заглянете в ObservableCollection класс вы можете видеть, что он уже реализован:

public class ObservableCollection<T> : Collection<T>, INotifyCollectionChanged, INotifyPropertyChanged