如何使用MVVM设计从WPF中的viewmodel更新视图

时间:2011-05-09 13:41:10

标签: mvvm

我在第一个项目中使用带有MVVM设计的WFP,我在处理来自客户端的命令更新实体后遇到了更新视图的问题。此时,视图可以与视图模型对话,但视图模型无法与视图对话。 任何人都知道如何使这个工作? 谢谢, Jdang

4 个答案:

答案 0 :(得分:3)

当ViewModel属性发生更改时,您应该使ViewModel实现INotifyPropertyChanged并触发PropertyChanged事件。假设UI绑定到ViewModel属性,这应该可以工作。

答案 1 :(得分:3)

如果您不熟悉MVVM模式,我推荐以下作为MSDN的优秀资源,涵盖了模式以及如何在WPF和Silverlight应用程序中实现它:

  1. Implementing the MVVM Pattern
  2. Advanced MVVM Scenarios
  3. 根据您所说的内容,您可能希望查看data binding,以及如何利用INotifyPropertyChangedINotifyCollectionChangedICollectionView界面启用视图和视图模型之间的双向通信。

    Silverlight和WPF数据绑定支持多种数据绑定模式。通过单向数据绑定,可以将UI控件绑定到视图模型,以便在呈现显示时它们反映基础数据的值。当用户在UI中修改基础数据时,双向数据绑定也将自动更新基础数据。为确保在视图模型中数据发生更改时UI保持最新,它应实现相应的更改通知界面。

答案 2 :(得分:2)

在典型的MVVM应用程序中,您使用绑定将视图连接到ViewModel。当ViewModel引发由PropertyChanged接口定义的INotifyPropertyChanged事件时,绑定会自动更新。因此,您需要在ViewModel中实现该接口,并在更改属性值时引发PropertyChanged事件,并且视图将自动反映更改。

答案 3 :(得分:1)

另外到其他答案,我还建议你的ViewModel扩展DependencyObject

有些人认为DependencyObjects很重(如果你创建了数千个实例,它们就可以了),对于新用户来说有点复杂(大多数情况下都存在这种情况)。但是,DependencyObjects还有其他优点,例如自动支持属性更改通知和绑定评估速度。

这是我的DP片段(在C:\ Users [你的名字在这里]保存为DependencyProperty.snippet \ Documents \ Visual Studio [2010,2008] \ Code Snippets \ Visual C#\ My Code Snippets):

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
      <Title>SnippetFile1</Title>
      <Author>will</Author>
      <Description>
      </Description>
      <HelpUrl>
      </HelpUrl>
      <Shortcut>dp</Shortcut>
    </Header>
    <Snippet>
      <Declarations>
        <Literal Editable="true">
          <ID>PropertyName</ID>
          <ToolTip>Property name</ToolTip>
          <Default>PropertyName</Default>
          <Function>
          </Function>
        </Literal>
        <Literal Editable="false">
          <ID>ClassName</ID>
          <ToolTip>Class name</ToolTip>
          <Default>ClassName</Default>
          <Function>ClassName()</Function>
        </Literal>
        <Literal Editable="true">
          <ID>Type</ID>
          <ToolTip>Property type</ToolTip>
          <Default>object</Default>
          <Function>
          </Function>
        </Literal>
        <Literal Editable="true">
          <ID>DefaultValue</ID>
          <ToolTip>Default value</ToolTip>
          <Default>null</Default>
          <Function>
          </Function>
        </Literal>
      </Declarations>
      <Code Language="csharp"><![CDATA[#region $PropertyName$
/// <summary>
/// The <see cref="DependencyProperty"/> for <see cref="$PropertyName$"/>.
/// </summary>
public static readonly DependencyProperty $PropertyName$Property =
    DependencyProperty.Register(
        $PropertyName$Name, 
        typeof($Type$), 
        typeof($ClassName$), 
        new UIPropertyMetadata($DefaultValue$));

/// <summary>
/// The name of the <see cref="$PropertyName$"/> <see cref="DependencyProperty"/>.
/// </summary>
public const string $PropertyName$Name = "$PropertyName$";

/// <summary>
/// $end$
/// </summary>
public $Type$ $PropertyName$
{
    get { return ($Type$)GetValue($PropertyName$Property); }
    set { SetValue($PropertyName$Property, value); }
}
#endregion  ]]></Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>