如何在WinRT中使用INotifyPropertyChanged的?(How do I use I

2019-07-31 18:55发布

我是一个总的新手,刚学的基础知识DataContext和MVVM模型。 现在我有了必然要它实现了一个视图模型对象的网格INotifyPropertyChanged ,但是似乎UpdateSourceTrigger (其中所有的WPF的教程告诉我用)不提供的WinRT / Metro风格应用程序!

如何执行INotifyPropertyChanged呢?

我在我的系绳结束了。 我已经花了最基本的应用实例几乎整整一天,无非是想获得一个网格,更新我点击的东西之后。 我已经成功地做到这一点,到目前为止的唯一方法是创建视图模型的一个全新的实例,并重新分配DataContext ,我知道错了

更新:

我已经取得了一些进展,但事情变得很怪异。 我有一个视图模型,以项目的泛型列表。 该项目列表连线了一个PropertyChangedEventHandler。 如果我有一个新的,列表视图更新替换整个集合。

model.Items = new List<DataItem>{ new DataItem{ Title = "new item" }};

这导致了一个项目列表与上述项目。 不过,如果我尝试添加一个项目,什么也没有发生

model.Items.Add(new DataItem{ Title = "added item" });

我也尝试创建它增加了一个项目,专门烧制的PropertyChanged的方法,但也不能正常工作

这里的地方会很奇怪。 接下来我想这个代码。

model.Items.Add(new DataItem { Title = "added item" });
model.Items = new List<DataItem> { new DataItem { Title = "new item" }}; 

这将导致两个项目列表:

- new item
- added item

怎么会这样? 该守则的规定,“增加一个项”,然后“整体更换名单”,但它以相反的顺序执行?

更新2:

作为建议,这实际上已经解决了原来的问题,我已经切换到的ObservableCollection。 我现在可以添加一个项目,它显示在列表上。

然而,新的怪异的行为仍然有效。 在收集之前添加的项目被重置附加到新的集合的末尾。 为什么我的代码以相反的顺序执行?

Answer 1:

您需要实现该接口并发出一次给定的属性,您关心的变化的通知。

        public event PropertyChangedEventHandler PropertyChanged;

        public string CustomerName
        {
            get
            {
                return this.customerNameValue;
            }

            set
            {
                if (value != this.customerNameValue)
                {
                    this.customerNameValue = value;
                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("CustomerName"));
                    }
                }
            }
        }

请记住,对于一个集合,你应该使用的ObservableCollection ,因为它会照顾的INotifyCollectionChanged被解雇,当一个项目被添加或删除。

我建议尽可能地扩展您的样品回来。 不要用一个启动DataGrid ,而是一个简单的TextBoxButton ,在Button迫使您的视图模型的变化,然后将反映在UI上。



Answer 2:

取自代码这里 。

这是最好的实现它实现了它这样一个父类:

public class NotifyPropertyChangedBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged = delegate { };

    protected void RaisePropertyChanged(string propertyName)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

然后你在你的财产的子类(即视图模型)做这样的事情:

public class MyViewModel : NotifyPropertyChangedBase
{
    private string _name;
    public string Name {
      get{ return _name; }
      set{ 
       _name = value;
       RaisePropertyChanged("Name");
      }
    }
}


文章来源: How do I use INotifyPropertyChanged in WinRT?