【问题标题】:INotifyPropertyChanged vs ObservableCollection for a single value单个值的 INotifyPropertyChanged 与 ObservableCollection
【发布时间】:2016-08-16 13:56:57
【问题描述】:

在使用 MVVM 模式和 WPF 绑定进行编码的示例中,当它是单个值时,它们使用 INotifyPropertyChanged,当它是值列表时,它们使用 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}">

【问题讨论】:

  • "这样做合适吗?"如果它有效,那么它就有效。只要您没有遇到任何性能问题,那么我认为就可以了。因为就像您说的那样,您不能将静态属性与 INotifyPropertyChanged 一起使用。我不知道在 ObservableCollection 上使用 INPC 有什么好处,因为它们通常以不同的方式使用,但在这种情况下,您不能在静态属性上使用 INPC。
  • 你也可能对这个问题的接受答案感兴趣stackoverflow.com/questions/14614190/…
  • 将属性包装在视图模型中,将视图模型放入静态属性中。完成。
  • 我最好将该静态属性移到另一个类中,从中生成单例,然后像往常一样绑定。至少看起来并不比使用带有单个元素的集合更糟糕。
  • 您还可以在视图模型中定义常规(非静态)属性,但使其引用 getter\setter 中的静态字段。这样您仍然可以进行常规绑定,但可以达到与静态属性相同的效果。

标签: wpf mvvm static observablecollection inotifypropertychanged


【解决方案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; }

如果您为MyClass 执行Text.Text = "Hello" 或为Text[0] = "Hello" 执行ObservableCollection,两者将以相同的方式反映。

现在,如果您必须使用静态属性进行绑定,那么不要使用 ObservableCollection,我会建议您编写新类 因为ObservableCollection 有很多内部实现 可能对您没有任何实际消耗的内存& 性能。

【讨论】:

    【解决方案2】:

    这个link 可能会有所帮助,它显示了 List、ObservableCollection 和 INotifyPropertyChanged 之间的区别。

    希望有帮助

    【讨论】:

      猜你喜欢
      • 2013-03-30
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      • 2011-06-03
      • 2021-04-29
      • 2012-04-05
      • 1970-01-01
      • 2021-05-20
      相关资源
      最近更新 更多