Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用MVVM设计从WPF中的viewmodel更新视图_Mvvm - Fatal编程技术网

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

如何使用MVVM设计从WPF中的viewmodel更新视图,mvvm,Mvvm,我在我的第一个项目中使用WFP with MVVM设计,在处理来自客户端的更新实体的命令后,我在更新视图方面遇到了问题。此时,视图可以与viewmodel对话,但viewmodel无法与视图对话。 有人知道怎么做吗? 谢谢 Jdang您应该使ViewModel实现INotifyPropertyChanged,并在ViewModel属性更改时触发PropertyChanged事件。假设UI绑定到ViewModel属性,这应该可以工作。在典型的MVVM应用程序中,可以使用绑定将视图连接到ViewMo

我在我的第一个项目中使用WFP with MVVM设计,在处理来自客户端的更新实体的命令后,我在更新视图方面遇到了问题。此时,视图可以与viewmodel对话,但viewmodel无法与视图对话。 有人知道怎么做吗? 谢谢
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>