как реализовать наблюдаемый int в wpf ViewModel? - PullRequest
18 голосов
/ 29 ноября 2011

В моем mvvm ViewModel у меня есть такое поле

public int Delta { get; private set; }

Однако, когда я обновляю его так:

Delta = newValue;

Пользовательский интерфейс не обновляется.

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

Однако нет ObservableInt, как сказать View, что его нужно обновить тогда?

Возможно, мне следует вызвать какое-то событие "уведомить свойство изменено" или что-то в этом роде

Ответы [ 5 ]

34 голосов
/ 29 ноября 2011

У вас есть два варианта:

  1. Реализация интерфейса INotifyPropertyChanged в вашем классе.
  2. Наследовать от DependencyObject и реализовывать Delta как DependencyProperty.

Самый простой вариант - # 1. Вы можете легко реализовать интерфейс INotifyPropertyChanged в своем классе:

public class YourClass : INotifyPropertyChanged
{

  private int _delta;
  public int Delta
  {
      get { return _delta; }
      set { _delta = value; NotifyPropertyChanged("Delta"); }
  }

  public event PropertyChangedEventHandler PropertyChanged;
  private void NotifyPropertyChanged(String propertyName)
  {
      PropertyChangedEventHandler handler = PropertyChanged;
      if (null != handler)
      {
          handler(this, new PropertyChangedEventArgs(propertyName));
      }
  }
  }

Подробнее о можно узнать и используя свойства зависимости в MSDN.

4 голосов
/ 07 мая 2017

Используя ответ @ LBushKin, я изменил его на

public class Prop<T> : INotifyPropertyChanged
{
    private T _value;
    public T Value
    {
        get { return _value; }
        set { _value = value; NotifyPropertyChanged("Value"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    internal void NotifyPropertyChanged(String propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

и настроил:

class MainWindow ...
    // a bool with initial value of true
    public static Prop<bool> optionBool { get; set; } = new Prop<bool>{ Value = true };

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        // connect UI to be able to use the Prop
        DataContext = this;
    }

и использовал его:

<Grid ...
    <CheckBox Content="Da Check" ... IsChecked="{Binding optionBool.Value}"/>

Здесь также имеется версия Collection и 2-Properties: Utils.ObservableProperties.cs (это репо содержит несколько связанных классов)

3 голосов
/ 29 ноября 2011

Просто реализуйте интерфейс INotifyPropertyChanged в своем классе и используйте его, чтобы вызвать PropertyChanged для вашего свойства, а затем пользовательский интерфейс будет обновлен. Если вы используете шаблон проекта MVVM, то, скорее всего, у вас уже есть вспомогательный метод, вам нужно его использовать.

MSDN INotifyPropertyChanged

GalaSoft MVVM Light Toolkit

2 голосов
/ 16 ноября 2017

Пока мы работаем над улучшением ответа, некоторые другие новые добавления в c # 6.0 и 7.0 помогают сделать его еще более компактным:

public class Prop<T> : INotifyPropertyChanged
{
    private T _value;

    public T Value
    {
        get => _value; 
        set { _value = value; NotifyPropertyChanged(nameof(_value)); }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    internal void NotifyPropertyChanged(String propertyName) => 
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

Таким образом, вы не используете какие-либо «встроенные значения» (т.е. имя свойства) и сохраняете код безопасным для рефакторинга.

А также нет необходимости в избыточных кодовых блоках из-за новых возможностей Expression в c # 6.0 и 7.0

2 голосов
/ 29 ноября 2011

ObservableCollection вызывает события автоматически, но для ваших собственных свойств вы должны сами вызывать события.

Хороший пример здесь: http://www.codeproject.com/Tips/228352/Naming-Properties-in-MVVM?display=Print

Я бы предложил использовать mvvmlight: http://mvvmlight.codeplex.com, Я использовал его в приложениях silverlight и wpf.Очень прост в использовании и обеспечивает систему сообщений между моделью, моделью представления и видом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...