【发布时间】:2010-12-07 19:09:59
【问题描述】:
我有一个真正简单的示例,它可以在没有视图模型的情况下很好地工作,因为我有一个项目 实现 iNotifyPropertyChanged 的类:
public class Item : INotifyPropertyChanged
{
private string _name;
private string _desc;
public string Name
{
get
{ return _name; }
set
{
if (_name == value)
return;
_name = value;
this.OnPropertyChanged(new PropertyChangedEventArgs("Name"));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
public Item()
{
}
protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, e);
}
}
这适用于一个简单的示例,其中我有以下代码:
public MainPage()
{
InitializeComponent();
item = new Item() { Name = "john", Description = "this is my name" };
LayoutRoot.DataContext = item;
}
如果我在后面的代码中有一个调用命令处理程序的按钮,我会看到更改 到简单的用户界面,因为 propertychanged 事件正在被“监听”,因为 我的文本属性上的 Twoway 绑定。处理程序看起来像:
private void Button_Click(object sender, RoutedEventArgs e)
{
item.Name = "ted";
item.Description = "adddress";
}
所以当然这会改变 UI(我说这是一个非常简单的示例) 现在我介绍一个 Viewmodel 并且对简单模型的更改不会反映为 没有人在监听 propertychanged。
我将视图中的数据上下文设置为视图模型,实际上这是视图中唯一的代码行:
LayoutRoot.DataContext = new MyViewModel();
现在我的 Viewmodel 看起来像:
public class MyViewModel
{
Item item = null;
public ICommand ChangeCommand { get; private set; }
public MyViewModel()
{
item = new Item() { Name = "john", Description = "jjjj" };
ChangeCommand = new DelegateCommand<string>(OnChange);
}
private void OnChange(string title)
{
item.Name = "bill";
}
注意事项: 我使用模式和实践命令将事件从 XAML 触发到 Viewmodel 这很好用
我的处理程序再次更改了 item.name,这导致 setter 被调用并且 this.OnPropertyChanged(new PropertyChangedEventArgs("Name"));被叫但没有人 聆听,因此不会进行任何更改。
我试图让这个例子真正简单,有些人会说太简单了,但我只是想 知道为什么绑定不起作用。我可以从视图拉到视图模型,但我需要 能够做相反的事情。我想知道我错过了什么。
【问题讨论】:
-
我想我猜对了您的问题,但如果您另外包含 XAML 数据绑定代码,问题会更清楚。
标签: silverlight mvvm binding