3

В примерах для кодирования с использованием шаблона MVVM и привязки WPF они используют INotifyPropertyChanged, когда это одно значение, и ObservableCollection, когда это список значений.INotifyPropertyChanged vs ObservableCollection для одного значения

Я также читал, вы не можете использовать статические переменные с INotifyPropertyChanged, но вы можете с ObservableCollection. Я хотел бы привязываться к статической переменной.

Простейший (для меня как минимум) обходной путь - это использовать ObservableCollection и всегда просто использовать и связывать с индексом 0. Это уместно? Есть ли польза от использования INotifyPropertyChanged вместо ObservableCollection?

Например: Это, кажется, самый простой обходной путь:

public static ObservableCollection<int> MyValues { get; set; } 

<TextBox Text="{Binding MyValue[0]}"> 

Для желающих сделать это:

private static int _myValue; 
public static int MyValue //does not work 
{ 
    get { return _myValue; } 
    set { _myValue = value; OnPropertyChange(); } 
} 

<TextBox Text="{Binding MyValue, UpdateSourceTrigger=PropertyChanged}"> 
+0

«Это уместно?» Если он работает, то он работает. Пока вы не сталкиваетесь с какой-либо проблемой производительности, я думаю, что все в порядке. Потому что, как вы сказали, вы не можете использовать статическое свойство с INotifyPropertyChanged. Я не знаю никакой пользы от использования INPC над ObservableCollection, потому что они обычно используются по-разному, но в этом случае вы не можете использовать INPC для своего статического свойства. – Zack

+0

Вас также может заинтересовать принятый ответ на этот вопрос http://stackoverflow.com/questions/14614190/inotifypropertychanged-and-static-properties – Zack

+0

Вы можете теоретически изменять уведомления со статическим свойством ('public static event EventHandler StaticPropertyChanged', blah blah), но ... Я пробовал, он не работал, и ваш хак выглядит намного меньше проблем и на самом деле работает. Благодаря! –

ответ

1

Я не думаю, что ваша аналогия справедливо (Сравнения ObservableCollection с непосредственно Primitive Type собственности). Сравнить ObservableCollection до уровня ниже класса

public class MyClass : INotifyPropertyChanged 
{ 

    private string text; 

    public string Text 
    { 
     get { return text; } 
     set { text = value; 
     RaiseChange("Text"); 
     } 
    } 


    public event PropertyChangedEventHandler PropertyChanged; 
    private void RaiseChange(string prop) 
    { 
     if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(prop)); } 
    } 
} 

Теперь и ниже будет вести себя так же:

public static MyClass Text { get; set; } 

public static ObservableCollection<string> Text { get; set; } 

Если вы выполняете Text.Text = "Hello" для MyClass или Text[0] = "Hello" для ObservableCollection, как будут отражены в таким же образом.

Теперь, если вы должны использовать статическое свойство для связывания, то вместо ObservableCollection я советую вам написать новый класс причина ObservableCollection имеет много внутренних реализаций, которые вероятно, не имеет смысла для вас любых фактически потребляющая память & perforamnce.

0

Это link может помочь, это показывает разницу между List, ObservableCollection и INotifyPropertyChanged.

Надеется, что это поможет