Oli*_*Oli 0 wpf binding user-controls dependency-properties mvvm
我正在使用 MVVM 模式在 WPF/c# 中编写表单并尝试与用户控件共享数据。(好吧,用户控件视图模型)
我要么需要:
用户控件仅用于使大型表单更易于管理,所以我不确定这是否是 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)
但我似乎无法获得接受非静态内容的依赖属性。
这对我来说已经有一段时间了,但假设我会发现但失败了,所以我在这里。
提前致谢,奥利
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)