0

我是一个新手,只是学习DataContextMVVM 模型的基础知识。我现在有一个网格绑定到实现 的视图模型对象INotifyPropertyChanged,但似乎UpdateSourceTrigger(所有 WPF 教程告诉我使用)不适用于 WinRT / Metro Style 应用程序!

那我该如何实现 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,这实际上解决了最初的问题。我现在可以添加一个项目,它会显示在列表中。

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

4

2 回答 2

3

一旦您关心的给定属性发生更改,您需要实现该接口并发送通知。

        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添加或删除项目时触发。

我建议尽可能缩小您的样本。不要从 a 开始,DataGrid而是从一个简单的TextBoxand开始ButtonButton它会强制您的 ViewModel 发生变化,这将反映在 UI 上。

于 2012-09-21T14:19:27.940 回答
3

代码取自这里

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

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

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

然后在您的属性中的子类(即 ViewModel)中执行以下操作:

public class MyViewModel : NotifyPropertyChangedBase
{
    private string _name;
    public string Name {
      get{ return _name; }
      set{ 
       _name = value;
       RaisePropertyChanged("Name");
      }
    }
}
于 2012-09-21T14:24:22.947 回答