如何使用MVVM设计从WPF中的viewmodel更新视图
我在我的第一个项目中使用WFP with MVVM设计,在处理来自客户端的更新实体的命令后,我在更新视图方面遇到了问题。此时,视图可以与viewmodel对话,但viewmodel无法与视图对话。 有人知道怎么做吗? 谢谢如何使用MVVM设计从WPF中的viewmodel更新视图,mvvm,Mvvm,我在我的第一个项目中使用WFP with MVVM设计,在处理来自客户端的更新实体的命令后,我在更新视图方面遇到了问题。此时,视图可以与viewmodel对话,但viewmodel无法与视图对话。 有人知道怎么做吗? 谢谢 Jdang您应该使ViewModel实现INotifyPropertyChanged,并在ViewModel属性更改时触发PropertyChanged事件。假设UI绑定到ViewModel属性,这应该可以工作。在典型的MVVM应用程序中,可以使用绑定将视图连接到ViewMo
Jdang您应该使ViewModel实现INotifyPropertyChanged,并在ViewModel属性更改时触发PropertyChanged事件。假设UI绑定到ViewModel属性,这应该可以工作。在典型的MVVM应用程序中,可以使用绑定将视图连接到ViewModel。当ViewModel引发由
INotifyPropertyChanged
接口定义的PropertyChanged
事件时,绑定将自动更新。因此,您需要在ViewModel中实现该接口,并在属性值更改时引发PropertyChanged
事件,视图将自动反映更改。如果您不熟悉MVVM模式,我推荐以下来自MSDN的优秀资源,包括该模式以及如何在WPF和Silverlight应用程序中实现该模式:
根据您所说的,听起来您可能想回顾一下,以及如何利用、和接口来实现视图和视图模型之间的双向通信
Silverlight和WPF数据绑定支持多种数据绑定模式。通过单向数据绑定,可以将UI控件绑定到视图模型,以便它们在呈现显示时反映基础数据的值。当用户在UI中修改基础数据时,双向数据绑定也将自动更新基础数据。为了确保当视图模型中的数据更改时,UI保持最新,它应该实现适当的更改通知界面。除了其他答案之外,我还建议扩展您的视图模型
有些人认为DependencyObjects很重(如果您创建了数千个实例,它们可能会很重),而且对于新用户来说有点复杂(在某些情况下,这肯定是真的)。但是,DependencyObjects还有其他优点,例如自动支持属性更改通知和绑定计算的速度
这是我的DP代码段(另存为C:\Users[YOUR NAME Here]\Documents\Visual Studio[20102008]\Code Snippets\Visual C\my Code Snippets中的DependencyProperty.snippet):
膨胀
代码段文件1
将
数据处理
属性名
属性名
属性名
类名
类名
类名
类名()
类型
属性类型
对象
默认值
默认值
无效的
///这是我的梦想。
///
公共静态只读DependencyProperty$PropertyName$Property=
从属属性。寄存器(
$PropertyName$Name,
typeof($Type$),
typeof($ClassName$),
新的UIPropertyMetadata($DefaultValue$);
///
///该文件的名称。
///
公用常量字符串$PropertyName$Name=“$PropertyName$”;
///
///$end$
///
公共$Type$$PropertyName$
{
获取{return($Type$)GetValue($PropertyName$Property);}
set{SetValue($PropertyName$Property,value);}
}
#endregion]]>
是的,我实现了INotifyPropertyChanged并触发PropertyChanged事件,但视图上没有任何更改。我需要做些什么特别的事情吗。目前我所拥有的是,我实现INotifyPropertyChanged并触发PropertyChanged事件,但视图上没有任何更改。我需要做些什么特别的事情吗。目前,这里是我的xaml文本=“{Binding User.UserName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}”的内容。你有什么例子让我看一下吗?它应该和你所拥有的一起工作。。。是否可以编辑您的问题以包含更多代码?是的,我实现了INotifyPropertyChanged并触发PropertyChanged事件,但视图上没有任何更改。我需要做些什么特别的事情吗。目前这里是我的文本=“{Binding User.UserName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}”您的绑定似乎是正确的。您是否已验证在通过设置断点更改用户名属性时引发PropertyChanged?此外,请仔细检查要引发事件的属性的文本名称是否与属性名称完全匹配。如果您愿意,发布您的视图和视图模型,这将有助于调试您的问题。我同意使用DependencyObject可以获得一些性能优势,但它们绑定到创建它们的线程,并且DependencyObject不可序列化。在某些情况下,它们肯定是可行的,但一般来说,将POCO与通知接口一起使用更安全(而且性能也相对较高)。对于那些感兴趣的人,它提供了有关威尔所谈论的性能影响的详细信息。非常抱歉,您解决了这个问题吗?我也陷入了同样的困境。。
<?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>