我正在使用MVVM模式在WPF / c#中编写表单,并尝试与用户控件共享数据。 (好吧,用户控件视图模型)
我要么:
usercontrol仅用于使大型表单更易于管理,因此我不确定这是否适合MVVM,这就是我过去的做法。
我想在Xaml中传递VM contruct的类。
<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));
但我似乎无法获得依赖属性来接受非静态内容。
这对我来说已经有一段时间了,但是假设我发现但是失败了,所以我在这里。
提前致谢, 奥利
答案 0 :(得分:4)
Oli - 如果UI变得太大,可以(实际上是推荐)将View的部分分成UserControl - 如果VM变得太大,您可以独立地将视图模型拆分为子视图模型。
虽然您正在对子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中,放置ApplicantTabView,并绑定其数据上下文:
...
<TabItem Header="Applicants">
<Views:ApplicantTabView DataContext="{Binding Client}" />
</TabItem>
答案 1 :(得分:2)
我最近回答了与您类似的问题:passing a gridview selected item value to a different ViewModel of different Usercontrol
基本上设置依赖项属性,该属性允许父视图中的数据持久保存到子用户控件。将您的视图抽象为特定的用户控件并使用依赖属性和MVVM模式将它们挂钩实际上非常强大,并且建议用于Silverlight / WPF开发,特别是在单元测试开始时。如果您想要进一步澄清,请告诉我,希望这会有所帮助。