Wpf INotifyPropertyChanged vs ObservableCollection针对单个值

Wpf INotifyPropertyChanged vs ObservableCollection针对单个值,wpf,mvvm,static,observablecollection,inotifypropertychanged,Wpf,Mvvm,Static,Observablecollection,Inotifypropertychanged,在使用MVVM模式和WPF绑定进行编码的示例中,如果是单个值,则使用INotifyPropertyChanged;如果是值列表,则使用observeCollection 我还读过,不能将静态变量与INotifyPropertyChanged一起使用,但可以与observetecollection一起使用。我想绑定到一个静态变量 最简单的(至少对我来说)解决方法是使用ObservableCollection,并且始终只使用并绑定到索引0。这样做合适吗?使用INotifyPropertyChange

在使用MVVM模式和WPF绑定进行编码的示例中,如果是单个值,则使用
INotifyPropertyChanged
;如果是值列表,则使用
observeCollection

我还读过,不能将静态变量与
INotifyPropertyChanged
一起使用,但可以与
observetecollection一起使用。我想绑定到一个静态变量

最简单的(至少对我来说)解决方法是使用
ObservableCollection
,并且始终只使用并绑定到索引0。这样做合适吗?使用
INotifyPropertyChanged
而不是
ObservableCollection
有什么好处吗

例如: 这似乎是最简单的解决方法:

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

<TextBox Text="{Binding MyValue[0]}">
publicstaticobserveCollectionmyvalues{get;set;}
对于想要这样做:

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

<TextBox Text="{Binding MyValue, UpdateSourceTrigger=PropertyChanged}">
private static int\u myValue;
公共静态int MyValue//不起作用
{ 
获取{return\u myValue;}
设置{u myValue=value;OnPropertyChange();}
}
这可能会有所帮助,它显示了List、ObservableCollection和INotifyPropertyChanged之间的区别


希望这有帮助

我不认为您的类比是公平的(将
observedcollection
与直接与
基元类型
属性进行比较)。将
observedcollection
与下面的类进行比较

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; }
publicstaticmyclass文本{get;set;}
公共静态ObservableCollection文本{get;set;}
如果对
MyClass
执行
Text.Text=“Hello”
,或对
observeCollection
执行
Text[0]=“Hello”
,两者都将以相同的方式反映

现在,如果您必须使用静态属性进行绑定,那么我建议您编写新类,而不是
observateCollection
原因
observedcollection
有许多内部实现 可能对你没有任何实际消耗内存的作用& 性能。


“这样做合适吗?”如果行得通,那就行了。只要您没有遇到任何性能问题,那么我认为这很好。因为正如您所说,您不能使用INotifyPropertyChanged的静态属性。我不知道在ObservableCollection上使用INPC有什么好处,因为它们通常以不同的方式使用,但在这种情况下,您不能在静态属性上使用INPC。您可能还对这个问题的公认答案感兴趣,将属性包装在视图模型中,将视图模型放入静态属性中。完成。我最好将该静态属性移动到另一个类中,使其成为singleton,然后像往常一样绑定。至少看起来比使用集合和单个元素更糟糕。您也可以在视图模型中定义常规(非静态)属性,但要使其引用getter\setter中的静态字段。这样,您仍然可以执行常规绑定,但可以实现与静态属性相同的效果。