2011-05-09 95 views
7

我现在用的是世界粮食计划署与MVVM设计,我的第一个项目,我有更新视图中的问题,我从客户端处理命令后更新实体更新从视图模型在WPF的看法。此时,视图可以与视图模型对话,但视图模型无法回复查看。 任何人有任何想法如何使这个作品? 谢谢, Jdang如何使用MVVM设计

+0

很抱歉,请问您解决了这个问题吗?我陷入同样的​​.. – curiousity 2015-06-30 15:31:04

回答

3

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

2

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

+0

是的,我执行INotifyPropertyChanged,并触发PropertyChanged事件,但是,鉴于没有什么变化。我需要做什么特别的事情吗?目前,这里是我 – AustinTX 2011-05-09 14:11:52

+0

是的,我执行INotifyPropertyChanged,并触发PropertyChanged事件,但是,鉴于没有什么变化。我需要做什么特别的事情吗?目前这里是我的xaml Text =“{Binding User。UserName,Mode = TwoWay,UpdateSourceTrigger = PropertyChanged}“。你有什么样的例子让我去看看吗? – AustinTX 2011-05-09 14:17:15

+0

它应该与你拥有的一起工作......你能编辑你的问题以包含更多的代码吗? – 2011-05-09 14:28:26

3

如果你是新来的MVVM模式,我建议从MSDN覆盖两个模式,如何实现它在WPF和Silverlight应用程序下面的优秀资源:

  1. Implementing the MVVM Pattern
  2. Advanced MVVM Scenarios

根据你所说的,这听起来像你可能想要查看data binding,以及如何利用的INotifyPropertyChangedINotifyCollectionChanged,一d ICollectionView接口,以实现视图和视图模型之间的双向通信。

Silverlight和WPF数据绑定支持多个数据结合模式。通过单向数据绑定,可以将UI控件绑定到视图模型,以便在呈现显示时反映底层数据的值。当用户在用户界面中修改底层数据时,双向数据绑定也会自动更新底层数据。为了确保UI在数据在视图模型中发生变化时保持最新,它应该实现适当的变更通知界面。

+0

是的,我执行INotifyPropertyChanged并触发PropertyChanged事件,但没有任何更改视图。我必须做任何特殊的视图。目前这里是我有Text =“{Binding User.UserName,Mode = TwoWay,UpdateSourceTrigger = PropertyChanged}” – AustinTX 2011-05-09 14:14:45

+1

您的绑定看起来是正确的你有没有证实PropertyChanged是通过设置断点来改变UserName属性的时候产生的呢?另外,请仔细检查你所引发的属性的文本名称是否与你的属性名完全匹配。并查看模型,如果你想,这将有助于调试您的问题。 – Oppositional 2011-05-09 15:19:58

1

另外对其他答案,我也建议有您的ViewModels延伸DependencyObject。有些人认为DependencyObjects是沉重的权重(如果你创建了成千上万个实例,它们可以是),对新用户来说有点复杂(绝对有些情况是这样的)。但是,对于DependencyObjects还有其他优点,例如自动支持属性更改通知和绑定评估速度。

这里是我的DP片段(保存为DependencyProperty.snippet在C:\用户[YOUR NAME HERE] \文档\ Visual Studio的[2010,2008] \代码段\的Visual C#\我的代码段):

<?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> 
+0

我同意你使用DependencyObject,一些性能优势,b ut它们绑定到它们创建的线程,并且依赖项对象不可序列化。在某些情况下,他们肯定是要走的路,但总的来说,使用带有通知接口的POCO更安全(并且相对表现更好)。 – Oppositional 2011-05-09 15:16:32

+0

对于那些有兴趣的人来说,http://msdn.microsoft.com/en-us/library/bb613546.aspx#HowDataBindingReferencesAreResolved提供了关于威尔正在谈论的性能影响的体面信息。 – Oppositional 2011-05-09 15:22:41