【问题标题】:passing data to a mvvm usercontrol将数据传递给 mvvm 用户控件
【发布时间】:2012-03-21 20:55:49
【问题描述】:

我正在使用 MVVM 模式在 WPF/c# 中编写一个表单,并尝试与用户控件共享数据。 (嗯,用户控制视图模型)

我要么需要:

  1. 在父级中创建一个视图模型并将其绑定到用户控件
  2. 将某些类与 Xaml 中的视图模型绑定
  3. 被告知用户控件不是与 MVVM 一起使用的方法,也不能被推向正确的方向。 (我见过数据模板,但它们看起来并不理想)

用户控件仅用于使大型表单更易于管理,因此我不确定这是否是使用 MVVM 的方式,这正是我过去会这样做的方式。

我想在 Xaml 中向 VM 结构传递一个类。

<TabItem Header="Applicants">
     <Views:ApplicantTabView>
         <UserControl.DataContext>
             <ViewModels:ApplicantTabViewModel Client="{Binding Client} />
         </UserControl.DataContext>
     </Views:ApplicantTabView>
 </TabItem>
public ClientComp Client
    {
        get { return (ClientComp)GetValue(ClientProperty); }
        set { SetValue(ClientProperty, value); }
    }

public static readonly DependencyProperty ClientProperty = DependencyProperty.Register("Client", typeof(ClientComp),
                                                                           typeof(ApplicantTabViewModel),
                                                                                       new FrameworkPropertyMetadata
                                                                                           (null));

但我似乎无法获得一个依赖属性来接受非静态内容。

这对我来说已经有一段时间了,但假设我会发现但失败了,所以我在这里。

提前致谢, 奥利

【问题讨论】:

  • 虚拟机通常不应该是依赖对象
  • 我不希望 VM 成为 DP,我只想能够与 UserControl 的 VM 共享一些父类。如果我尝试正常绑定,我会收到一个错误,它需要是 DP。
  • 是的,你通常也不(在那个方向)绑定虚拟机
  • 因此,如果我有一个包含多个部分的大型表单和一个越来越难以管理的虚拟机。解决这个问题的“行业标准”方式是什么?在 Winforms 中,我会制作一个 UserControl 来吐出表单。
  • 嗯,是的,但是您随后会将这些用户控件的 DataContext 绑定到您的 VM 的属性,而不是创建新 VM 并将其属性绑定到其他 VM。

标签: wpf binding mvvm user-controls dependency-properties


【解决方案1】:

Oli - 如果 UI 变得太大,可以(实际上 - 推荐)将部分视图拆分为 UserControl - 如果 VM 变得太大,您可以独立地将视图模型拆分为子视图模型。

您似乎正在对子虚拟机进行双重实例化。也不需要在你的VM中创建Dependency Property(其实我觉得是错的)。

在您的外部 VM 中,只需将 ClientComp 设置为常规属性。如果您不打算更改它 - setter 甚至不必触发属性更改事件,尽管建议这样做。

public class OuterVm
{
    public ClientComp Client { get; private set; }

    // instantiate ClientComp in constructor:
    public OuterVm( ) {
        Client = new ClientComp( );
    }
}

然后,在 XAML 中,放入申请人TabView,并绑定其数据上下文:

...
<TabItem Header="Applicants">
    <Views:ApplicantTabView DataContext="{Binding Client}" />
</TabItem>

【讨论】:

    【解决方案2】:

    我最近回答了一个和你类似的问题:passing a gridview selected item value to a different ViewModel of different Usercontrol

    本质上是设置一个依赖属性,它允许来自父视图的数据持久保存到您的子用户控件。将您的视图抽象为特定的用户控件并使用依赖属性以及 MVVM 模式来挂钩它们实际上非常强大,并且建议用于 Silverlight/WPF 开发,尤其是在单元测试开始发挥作用时。如果您需要更多说明,请告诉我,希望对您有所帮助。

    【讨论】:

    • 这是一个很大的帮助,但我认为我错过了一些关于依赖属性的非常基本的东西。我可以向您发送一个非常简单的项目吗?确实将不胜感激。 (如果您不介意,请发送邮件到我的 Gmail)
    • 您在依赖属性方面有什么问题?
    • 我很难使父子之间的绑定(通过视图上的 DP)成为“双向”绑定。我制作了一个带有 1 个窗口(Plus VM)/1 个用户控件(Plus VM)/1 个简单实体的小项目,并尝试在两者之间共享实体。我现在已经让实际项目工作到了一定程度,但我认为它与行业标准相去甚远。谢谢你的时间。奥利
    猜你喜欢
    • 2012-04-06
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    相关资源
    最近更新 更多