我在第一个项目中使用带有MVVM设计的WFP,我在处理来自客户端的命令更新实体后遇到了更新视图的问题。此时,视图可以与视图模型对话,但视图模型无法与视图对话。 任何人都知道如何使这个工作? 谢谢, Jdang
答案 0 :(得分:3)
当ViewModel属性发生更改时,您应该使ViewModel实现INotifyPropertyChanged并触发PropertyChanged事件。假设UI绑定到ViewModel属性,这应该可以工作。
答案 1 :(得分:3)
如果您不熟悉MVVM模式,我推荐以下作为MSDN的优秀资源,涵盖了模式以及如何在WPF和Silverlight应用程序中实现它:
根据您所说的内容,您可能希望查看data binding,以及如何利用INotifyPropertyChanged,INotifyCollectionChanged和ICollectionView界面启用视图和视图模型之间的双向通信。
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>