C# INotifyPropertyChanged的使用

C# INotifyPropertyChanged的使用,c#,wpf,xaml,binding,C#,Wpf,Xaml,Binding,有人能解释一下为什么在wpf中使用绑定时需要使用INotifyPropertyChanged的实现吗? 我可以绑定属性而不实现此接口吗? 例如,我有代码 public class StudentData : INotifyPropertyChanged { #region INotifyPropertyChanged Members public event PropertyChangedEventHandler PropertyChanged; #endregion

有人能解释一下为什么在wpf中使用绑定时需要使用INotifyPropertyChanged的实现吗? 我可以绑定属性而不实现此接口吗? 例如,我有代码

public class StudentData : INotifyPropertyChanged
{
    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;
    #endregion

    void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    string _firstName = null;
    public string StudentFirstName
    {
        get
        {
            return _firstName;
        }
        set
        {
            _firstName = value;

            OnPropertyChanged("StudentFirstName");
        }
    }
}
并在.xaml中绑定

<TextBox Text="{Binding Path=StudentFirstName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
   Grid.Row="1"
   Grid.Column="2"
   VerticalAlignment="Center" />
在这种情况下,为什么需要使用INotifyPropertyChanged?
这不是我的代码。

如果希望在属性通过代码更改时自动更新wpf表单,则需要
INotifyPropertyChanged
。此外,例如,一些控制器可能想知道是否已进行编辑以启用/禁用保存按钮。您也可能在不同的视图上显示相同的属性;在这种情况下,
INotifyPropertyChanged
有助于在编辑属性时立即更新其他视图

如果您认为您的表单在没有
INotifyPropertyChanged
的情况下运行良好,则可以删除它

请注意,即使没有更改INotifyPropertyChanged,绑定也可以工作。见:


我将实现这样的属性。在一些罕见的情况下,它可以帮助避免无休止的循环更新。顺便说一句,它的效率更高

 private string _firstName;
 public string StudentFirstName
 {
     get { return _firstName; }
     set
     {
         if (value != _firstName) {
             _firstName = value;
             OnPropertyChanged("StudentFirstName");
         }
     }
 }

从C#6.0(VS 2015)开始,您可以在PropertyChanged上实现如下功能:

private void OnPropertyChanged(string propertyName)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

当您绑定到StudentData的属性(如StudentFirstName时,绑定类将测试StudentData实例是否提供INotifyPropertyChanged接口。如果是这样,那么它将挂接到PropertyChanged事件中。当事件因StudentFirstName属性而激发时,它知道需要再次恢复源值,因为它已更改。这就是绑定能够监视源中的更改并在用户界面中反映这些更改的方式


如果不提供INotifyPropertyChanged接口,则绑定不知道源值何时更改。在这种情况下,当属性更改时,用户界面将不会更新。您将只看到第一次使用绑定时定义的初始值。

它确实需要实现才能使绑定工作,但这并不意味着您必须始终自己执行。还有其他选项,如(将类包装在代理中并将INPC注入所有虚拟属性)和(在后处理步骤中将其添加到IL中)。也可以自己实现,同时减少代码膨胀,如中所示。

我建议您查看一些关于Fody和MVVMLight与WPF的示例,可能对您非常有帮助XD。删除INotifyPropertyChanged,并尝试在单击按钮时更改学生的姓名。@dj其更改….OnPropertyChanged(…)引发我的属性已更改的事件,对吗?
private void OnPropertyChanged(string propertyName)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}