我正在尝试使用Silverlight学习MVVM模式。有大量的视频和博客。我在高层次上理解它,但似乎无法自己实现它。
我得到了以下视图:
<UserControl x:Class="SilverlightApplication1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:SilverlightApplication1.ViewModel"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<Grid x:Name="LayoutRoot" Background="White">
<TextBlock Text="{Binding Name, Mode=TwoWay}" Width="200" Height="200"/>
<Button Name="btn1" Width="200" Height="20" Margin="100,268,100,12" Click="btn1_Click"/>
</Grid> </UserControl>
在我的虚拟机中,我有: 命名空间SilverlightApplication1.ViewModel
{
public class ViewModel : INotifyPropertyChanged
{
private Model.UserModel m_model;
public ViewModel()
{
m_model = new Model.UserModel();
}
public string Name
{
get
{
return m_model.Name;
}
set
{
if (value != m_model.Name)
{
m_model.Name = value;
InvokePropertyChanged("Name");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void InvokePropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}
并在我的模型中:
namespace SilverlightApplication1.Model
{
public class UserModel
{
public string Name { get; set; }
}
}
基本上,我想模拟按钮单击并更新属性,以便它可以触发属性更改事件。我尝试在MainPage代码上硬编码属性,如下所示:
private void btn1_Click(object sender, RoutedEventArgs e)
{
ViewModel.ViewModel vm = new ViewModel.ViewModel();
vm.Name = "Test";
}
这不应该更新属性(对于Name)并引发propertychanged事件吗?我已经看到其他例子做了类似的事情。我不明白订阅活动的内容
任何人都能发光吗?
答案 0 :(得分:1)
在此示例中,要修复它,请尝试以下代码:
private void btn1_Click(object sender, RoutedEventArgs e)
{
ViewModel.ViewModel vm = new ViewModel.ViewModel();
this.LayoutRoot.DataContext = vm;
vm.Name = "Test";
}
注意:我知道你刚刚学习MVVM,但是在对这个范例感到满意之后,你应该采用一个框架,这样你就可以专注于MVVM管道之外的事情了。在说,在代码隐藏中做事不是MVVM方式,比如设置数据上下文。但是,我认为你只是在尝试和学习,所以现在好了。
答案 1 :(得分:0)
我认为你在这里缺少的步骤是将WPF表单的datacontext设置为viewmodel的一个实例。在你的xaml中,将你的UserControl datacontext设置为一个新的viewmodel,如下所示:
<UserControl.DataContext>
<vm:ViewModel />
</UserControl.DataContext>
然后只需在你的虚拟机中执行常规设置,它就应该将更改冒泡到绑定中。