8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

INotifyPropertyChanged 的​​使用

mat-mcloughlin 1月前

37 0

有人可以解释一下为什么在 wpf 中使用绑定时需要使用 INotifyPropertyChanged 的​​实现吗?我可以在没有实现这个接口的情况下绑定属性?例如我有代码...

有人能解释一下为什么在 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" />

此代码来自 .xaml.cs

StudentData _studentData = new StudentData { StudentFirstName = "John", StudentGradePointAverage = 3.5};

public MainWindow()
{
    InitializeComponent();

    this.DataContext = _studentData;
}

为什么在这种情况下我们需要使用 INotifyPropertyChanged?这不是我的代码。

帖子版权声明 1、本帖标题:INotifyPropertyChanged 的​​使用
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由mat-mcloughlin在本站《vb.net》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我建议你看一些关于 Fody 和 MVVMLight 与 WPF 的示例,也许对你很有帮助 XD。

  • 删除 INotifyPropertyChanged 并尝试在单击按钮时更改学生的姓名。

  • 如果您希望当属性通过代码更改时,wpf 表单能够自动更新,则需 INotifyPropertyChanged 要这样做 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) 开始,你可以 OnPropertyChanged 像这样实现:

    private void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    
  • OnPropertyChanged(...) 引发事件表明我的属性已发生改变,对吗?

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

    如果您不提供 INotifyPropertyChanged 接口,那么绑定就不知道源值何时发生变化。在这种情况下,当属性发生变化时,用户界面将不会更新。您只会看到首次使用绑定时定义的初始值。

  • 它确实需要实现才能使绑定工作,但这并不意味着你总是必须自己做。还有其他选项,如 Castle Dynamic Proxy (它将你的类包装在代理中并将 INPC 注入所有虚拟属性)和 Fody (在后处理步骤中将其添加到 IL)。你也可以自己实现,同时减少代码膨胀,正如 我在这个问题的回答 .

返回
作者最近主题: