【问题标题】:wpf , binding and datacontextwpf , 绑定和数据上下文
【发布时间】:2010-12-14 17:21:41
【问题描述】:

这是我的 ViewModel -

 public class ViewModel 
{
    public ObservableCollection<Person> Persons { get; set; }
}

这是类人:

public class Person : INotifyPropertyChanged
{
    private string _firstName;
    public string FirstName
    {
        get { return _firstName; }
        set
        {
            _firstName = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("FirstName"));
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

现在,每当其中一个人的名字发生变化时,我都想做一些任务, 假设提出一个消息框。

我该怎么做?

【问题讨论】:

    标签: wpf binding datacontext


    【解决方案1】:

    你需要实现INotifyPropertyChanged

    public class Person : INotifyPropertyChanged
    {
        private string firstName;
        public string FirstName 
        { 
           get { return this.firstName;} 
           set 
           { 
              this.firstName = value;
              this.RaisePropertyChanged("FirstName");
              MessageBox.Show("Hello World");
           }
        }
    }
    
    public event PropertyChangedEventHandler PropertyChanged;
    
    protected void RaisePropertyChanged(string propertyName)
    {
         PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
         if ((propertyChanged != null))
         {
             propertyChanged(this, new PropertyChangedEventArgs(propertyName));
         }
    }
    

    【讨论】:

    • 显示 MessageBox 的方式与 Binding/DataContext 或 INotifyPropertyChanged 无关;我的猜测是 OP 在属性的设置器中寻找的不仅仅是 MessageBox.Show()
    • @Aaron- 哦,真的是 Aaron,我不明白你怎么解释,“现在,每次有人的名字发生变化时,我都想做一些任务,比如说提出一个消息框.我该怎么做?”,任何其他方式。如果您有一些重要的想法,为什么不发布答案而不是发表您的意见。
    • 如果问题不清楚,请向 OP 询问更多信息。我只是指出这一点,以便您可以提供额外的路线来考虑这些因素。
    • @Aaron,我从来没有说过我不确定他们问题的含义。你是质疑它的人。这个问题很清楚,我的回答也是如此。感谢您告诉我如何解释问题和答案,但我想我已经控制住了。
    • 这个问题并不完全清楚,你的回答对你的解释来说是部分正确的,但它忽略了用户列表可能会改变(因为它是可观察的)并因此使 Person 实施INotifyPropertyChanged 只解决了一半问题(事件仍然需要在每个对象上订阅)
    【解决方案2】:

    通常,您的 person 类将使用接口 INotifyPropertyChanged,每当 FirstName 更改时触发 PropertyChanged 事件。这允许您将视图中的项目绑定到您的 Person 类,并且视图将在数据更改时更新。

    但是,要在出现任何 FirstName 时弹出消息框,您需要在视图中添加一些代码。一种方法是,和以前一样,使用 INotifyProperty 更改并订阅视图中所有 Person 对象的更改,每当调用更改 FirstName 的事件时使用 MessageBox.Show 。您可以使用 ObservableCollection 中的 CollectionChanged 事件来跟踪列表内外的 Person 对象,以确保它们都连接到您的 Person FirstName changed 事件处理程序。

    在我看来,最好的方法是在 ViewModel 中设置一个事件,而不是在任何 Person 类发生更改时触发的 Person 类(使用特定的 Person 对象作为参数)。这只有在 ViewModel 是唯一可以更改 Person.FirstName 的东西时才有效,并且您的 View 必须以适当的方式绑定到 ViewModel 才能实现这一点。

    【讨论】:

      【解决方案3】:

      您需要在您的视图模型上实现 INotifyPropertyChanged,并在设置您的人员集合时引发属性更改事件。这将使您能够听到它已经改变的事实。

      http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-22
        • 2016-04-28
        • 2017-03-12
        • 2010-11-10
        • 2015-12-14
        相关资源
        最近更新 更多