INotifyPropertyChanged - 更改PropertyName导致无效

时间:2015-12-13 16:19:10

标签: c# winforms inotifypropertychanged

我试图将我的Winforms UI绑定到我的ViewModel。我能够在UI更改上成功更新我的ViewModel,反之亦然。但是,我似乎无法理解" PropertyName"的用途。在PropertyChangedEventHandler中使用,因为我放在那里,它总是有效。我不知道自从我读过很多关于架构模式的文章(MVP,MVC,MVVM和MVP-VM(我正在尝试的那个)以来我是否已经搞混了现在要做))。

以下是相关代码的一部分:

视图模型

public class AdditionViewModel:INotifyPropertyChanged
{
    private string augend;

    public string Augend
    {
        get { return augend; }
        set { 
                if(augend != value)
                {
                    augend = value;
                    OnPropertyChanged(new PropertyChangedEventArgs("ugend"));
                }
            }
    }
    private string addend;

    public string Addend
    {
        get { return addend; }
        set {
                if (addend != value)
                {
                    addend = value;
                    OnPropertyChanged(new PropertyChangedEventArgs("ddend"));
                }
            }
    }
    private string answer;

    public string Answer
    {
        get { return answer; }
        set {
                if(answer != value)
                {
                    answer = value;
                    OnPropertyChanged(new PropertyChangedEventArgs("nswer"));
                }
            }
    }

    public AdditionClass additionClass;
    public AdditionViewModel(AdditionClass _additionClass)
    {
        additionClass = _additionClass;
    }
    public void Add()
    {
        //Some verifications first before inserting the value to the model class
        this.Augend = "1";//Testing for from code to UI binding
        additionClass.Augend = Double.Parse(Augend);
        additionClass.Addend = Double.Parse(Addend);
        //Somewhere here should implement the compute but since addition is a very simple task, no methods were called;
        Answer = additionClass.Answer.ToString();
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            MessageBox.Show(e.PropertyName);
            handler(this, new PropertyChangedEventArgs(e.PropertyName));
        }
    }
}

形式:

private void Form1_Load(object sender, EventArgs e)
{
    additionPresenter = new Presenter.AdditionPresenter(new ViewModel.AdditionViewModel(new Model.AdditionClass()));
    additionViewModelBindingSource.DataSource = additionPresenter.additionViewModel;
}

private void button1_Click(object sender, EventArgs e)
{
    additionPresenter.AddButtonClick();
}

主讲人:

public AdditionPresenter(AdditionViewModel _additionViewModel)
{
    additionViewModel = _additionViewModel;
}

public void AddButtonClick()
{
    additionViewModel.Add();
}

Designer中的一个自动生成的代码(在UI上绑定):

// 
// textBox1
// 
this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.additionViewModelBindingSource, "Addend", true));
this.textBox1.Location = new System.Drawing.Point(24, 41);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(100, 20);
this.textBox1.TabIndex = 0;

从ViewModel可以看出,我已经省略了setter中每个PropertyName开头的所有" A"但应用程序仍在工作。 对不起长代码贴。我似乎无法找到更好的解释,而不仅仅是向您展示实施

1 个答案:

答案 0 :(得分:3)

数据绑定不需要

INotifyPropertyChanged,但它可以实现双向数据绑定 事实上,如文档中所述: INotifyPropertyChanged接口用于通知客户端(通常是绑定客户端)属性值已更改。

在简单(单向)数据绑定中,当您更改控件的bound属性时,value会推入对象的bound属性,并且它不需要INotifyPropertyChanges

但如果没有INotifyPropertyChanged,如果使用代码更改对象的bound属性值,则新值不会进入控件的绑定属性。

在PropertyChanged事件中有错误的属性名称为什么我仍然有双向数据绑定?

事实上,由于使用BindingSource作为数据引导的来源,正如Fabio在评论中提到的那样。

使用BindingSource作为数据绑定的数据源时,您的对象足以实现INotifyPropertyChanged并引发PropertyChaned事件(即使属性为空或错误)名称),然后BindingSource(实际上是内BindingList<T>subscribes用于PropertyChaned事件,当received事件时,它检查您是否没有传递了正确的属性名称,或者如果您传递了空属性名称,它将调用ResetBindings(),从而导致绑定到BindingSource的控件重新读取列表中的所有项目并刷新其显示的值。 PropertyChanged中的正确名称会导致双向数据绑定的正常行为,并导致在e.PropertyDescriptor中使用正确属性引发ListChanged事件。