我一直在努力将我的应用程序移动到MVVM。 我试图通过MVVM从一些数据绑定许多文本框。
型号:
public class XMLItems
{
string input;
public string Input
{
get { return input; }
set { input = value; }
}
}
视图模型
public ViewModel() //Translates ICommands to methods
{
_ items = new XMLItems { Input = "" };
}
XMLItems _items;
public XMLItems Items
{
get
{
return _items;
}
set
{
_items = value;
}
}
public string Input
{
get { return Items.Input; }
set
{
if (Items.Input != value)
{
Items.Input = value;
OnPropertyChanged("Input");
}
}
}
public void ChangeInput(object obj)
{
Input = "123";
}
void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
这样一切顺利。触发ChangeInput
函数时,文本会更新123
。
但我需要做的是从我的模型中更新我的文本,其中包含所有代码逻辑,这发生在我的应用程序中的几个地方(更新文本)。但这似乎不起作用。 例如,如果我开枪:
public void ChangeText()
{
Input = "456";
}
...在我的模型中,它没有更新文本?
我似乎无法找到这样的其他例子?我错了吗?
答案 0 :(得分:2)
@ user469104大部分都是正确的。
如果您希望将内部的对象传播到UI,则需要该对象实现INotifyPropertyChanged
并引发{{1}在你关心的属性的setter中。
但是,如果View / ViewModel直接使用此对象(就像你的那样),这将自动生效。您无需亲自捕获PropertyChanged
事件。
由于PropertyChanged
实际上是DTO,我会按照我的描述完成。您实际上并不需要单独的ViewModel / Model业务对象。