使用MVVM-Light这是引发事件的正确方法吗?持久性应该去哪里?

时间:2011-06-05 22:37:02

标签: c# mvvm mvvm-light

在看了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);
        }
    }

1 个答案:

答案 0 :(得分:2)

  1. 您可以在Model或ViewModel中处理属性更改通知。在ViewModel中处理它是“mvvm-purist”方式,而在Model中处理它通常更方便,特别是对于较小的应用程序。

  2. 将模型持久保存到数据存储区将是VM的工作。模型只不过是一个虚拟数据对象。

  3. View绑定到ViewModel或Model的属性。当它们发生变化时,它会自动更新,前提是调用PropertyChange通知。

    您可以将View的属性从ViewModel公开给View,就像您发布的示例(mvvm-purist方法)一样,或者将整个Model从ViewModel暴露给View(通常更快到代码。模型处理属性更改通知)。在第二种情况下,您可以将视图绑定到MyViewModel.CurrentModel之类的内容,每当ViewModel更改CurrentModel对象时,视图都会更新。

  4. 您可能对我的this post感兴趣。这是一个非常简单的MVVM示例,它显示了每个MVVM层包含的内容。