在看了MVVM-Light并按照一些例子后,我把这个简单的例子放在了一起。如下所示,我展示了一个我正在接线的属性,如果我对文本框进行了更改,则会更新文本块。
我的问题是
1)VM是否应该管理提升变更事件? 一些示例(包括来自mvvm-light的宏)显示了模型中的RaisePropertyChanged,但我没有看到viewmodel是如何订阅通知的。
此示例显示VM引发事件
http://dotnet.dzone.com/articles/mvvm-light-whats-messenger?mz=27249-windowsphone7
显示了提升事件的viewmodel。
2)将模型持久存储到数据存储区的位置是什么?那是在模型还是视图模型中?
3)从商店读取后,视图如何获得初始值的通知?我想这个问题的答案很大程度上取决于2)的答案。
谢谢。
模特
public string StringOne
{
get { return stringOne; }
set
{
if (stringOne == value) return;
stringOne = value;
// RaisePropertyChanged("StringOne");
}
}
视图
<TextBlock x:Name="StringOneLabel" Text="StringOne" Margin="30,125,341,0" Height="41" VerticalAlignment="Top" />
<TextBlock x:Name="StringOne" Text="{Binding StringOne}" Margin="145,125,86,0" Height="41" VerticalAlignment="Top" />
<TextBox Height="78" Text="{Binding StringOne}" HorizontalAlignment="Left" Margin="145,258,0,0" Name="txtStringOne" VerticalAlignment="Top" Width="249" >
<Custom:Interaction.Triggers>
<Custom:EventTrigger EventName="TextChanged">
<GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding StringOneTextChanged}" CommandParameter="{Binding ElementName=txtStringOne}" />
</Custom:EventTrigger>
</Custom:Interaction.Triggers>
</TextBox>
ViewModel
public string StringOne
{
get { return SettingsModel.StringOne; }
set
{
var oldValue = SettingsModel.StringOne;
SettingsModel.StringOne = value;
RaisePropertyChanged("StringOne", oldValue, value, true);
}
}
答案 0 :(得分:2)
您可以在Model或ViewModel中处理属性更改通知。在ViewModel中处理它是“mvvm-purist”方式,而在Model中处理它通常更方便,特别是对于较小的应用程序。
将模型持久保存到数据存储区将是VM的工作。模型只不过是一个虚拟数据对象。
View绑定到ViewModel或Model的属性。当它们发生变化时,它会自动更新,前提是调用PropertyChange通知。
您可以将View的属性从ViewModel公开给View,就像您发布的示例(mvvm-purist方法)一样,或者将整个Model从ViewModel暴露给View(通常更快到代码。模型处理属性更改通知)。在第二种情况下,您可以将视图绑定到MyViewModel.CurrentModel
之类的内容,每当ViewModel更改CurrentModel对象时,视图都会更新。
您可能对我的this post感兴趣。这是一个非常简单的MVVM示例,它显示了每个MVVM层包含的内容。