将数据传递给 mvvm 用户控件

Oli*_*Oli 0 wpf binding user-controls dependency-properties mvvm

我正在使用 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>
Run Code Online (Sandbox Code Playgroud)
<TabItem Header="Applicants">
     <Views:ApplicantTabView>
         <UserControl.DataContext>
             <ViewModels:ApplicantTabViewModel Client="{Binding Client} />
         </UserControl.DataContext>
     </Views:ApplicantTabView>
 </TabItem>
Run Code Online (Sandbox Code Playgroud)

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

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

提前致谢,奥利

Uri*_*Uri 5

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

看来您正在对子虚拟机进行双重实例化。也没有必要在你的 VM 中创建依赖属性(实际上,我认为这是错误的)。

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

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

    // instantiate ClientComp in constructor:
    public OuterVm( ) {
        Client = new ClientComp( );
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,在 XAML 中,放置 ApplicantTabView,并绑定其数据上下文:

...
<TabItem Header="Applicants">
    <Views:ApplicantTabView DataContext="{Binding Client}" />
</TabItem>
Run Code Online (Sandbox Code Playgroud)