将数据传递给mvvm用户控件

时间:2012-03-03 18:46:12

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

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

我要么:

  1. 在父项中创建一个View模型并将其绑定到User Control
  2. 使用Xaml中的视图模型绑定某些类
  3. 被告知用户控件不适合使用MVVM并被推向正确的方向。 (我见过数据模板,但看起来并不理想)
  4. 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));
    

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

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

    提前致谢, 奥利

2 个答案:

答案 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开发,特别是在单元测试开始时。如果您想要进一步澄清,请告诉我,希望这会有所帮助。