INotifyPropertyChanged是否需要在所有属性中调用

时间:2016-02-23 19:58:33

标签: c# wpf

我有一个模特

    private List<POStatusModel> _postatuslist;
    public List<POStatusModel> PoStatusList
    {
        set
        {
            _postatuslist = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("PoStatusList"));
        }
        get { return _postatuslist; }
    }

    public class POStatusModel
    {
        public int pocount { set; get; }
        public string postatus { set; get; }
        public DateTime timestamp { set; get; }
        public System.Windows.Media.Brush brushColor { set; get; }
        public POStatusModel()
        { }

    }

哪个绑定到项目控件

        <ItemsControl Name="PoStatusItemsControl" Grid.Row="1" Margin="10,2,2,0" ItemsSource="{Binding PoStatus.PoStatusList}">
            <ItemsControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Foreground="{Binding brushColor}">
                    <Run Text="{Binding pocount}"></Run>
                    <Run Text="-"></Run>
                    <Run Text="{Binding postatus}"></Run>
                </TextBlock>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
     </ItemsControl>

有时候列表会刷新,可能会出现不同的数据。但它没有改变。即使调用被提升了。

这是我在视图模型中更新列表的方式

   public MetricPoStatusModel PoStatus { get; set; }

并在计时器下执行此操作

PoStatus = new MetricPoStatusModel(Connection);

我是否应该对PoStatus模型类下的元素进行propertychanged调用?

谢谢。

3 个答案:

答案 0 :(得分:2)

WPF感觉由INotifyPropertyChanged和IObservableCollection改变, 因此,您可以在任何需要的位置检测实现这些接口所需的更改。 例如,如果要向PoStatusList添加项目,则需要使用ObservableCollection,如果按新列表设置列表(PoStatusList),则需要调用NotifyPropertyChanged。

答案 1 :(得分:1)

  1. 不要使用列表,而是使用ObservableCollection,它已经实现了与通知相关的内容。当您向集合添加新项目时,它将自动添加到控件
  2. 您在要由控件表示的类上使用INotifyProperty更改,并在数据更新时触发UI更新。因此,如果您希望显示和更新POStatusModel的时间戳,POStatusModel将需要实现接口
  3. 不要像使用画笔那样将UI内容包含在VieModel中。您可以包含表示名称的字符串,并使用绑定定义来定义所谓的转换器。它是一个介于数据和UI元素之间的类。如果您在VM的字符串中存储颜色名称&#34; red&#34;并且VM绑定到控件,然后您定义的转换器将获取字符串并尝试将其转换为所需的颜色对象。听起来像一个小开销,但它实际上是非常有用和惊人的。一旦你收集了大约20-30个转换器的集合,一旦你发现转换器的参数,你的工作效率就会高涨,特别是你的生产力
  4. 使用Fody,这将为您节省大量时间。
  5. 您永远不需要使用自定义属性来显示自定义日期格式,您可以在XAML中指定格式
  6. 我没有深入细节,但使用基本的buzwords,你应该能够在谷歌上找到大量的资源。

答案 2 :(得分:1)

应该使用ObservableCollection而不是列表;除非列表是静态的。

使用ObservableCollection不需要使用INotifyPropertyChanged。

创建后,不应将ObservableCollection重新分配给新列表,即如果要重新填充它,请使用Clear()然后添加条目