我试图将我的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"但应用程序仍在工作。 对不起长代码贴。我似乎无法找到更好的解释,而不仅仅是向您展示实施
答案 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
事件。