MVVM + UserControl +依赖属性

时间:2013-03-02 15:26:22

标签: wpf mvvm user-controls dependency-properties

好的,这与这个问题有些相关:WPF Printing multiple pages from a single View Model

我试着按照那里给出的建议,但现在我被卡住了。

我的应用程序使用MainView.xaml和相应的MainViewViewModel.cs,我在后台使用MVVM Light。

现在 - 根据帖子 - 似乎我必须做以下事情:

  • 创建用户控件
  • 从用户控件中公开一些属性
  • 确保视图模型显示这些属性

这个想法很明确,但我在试图互相通知时感到困惑。

我的用户控件(UcTest.xaml)公开了一个依赖属性:

public string SpecialText
{
    get { return (string)GetValue(SpecialTextProperty); }
    set
    {
        SetValue(SpecialTextProperty, value);

    }
}

// Using a DependencyProperty as the backing store for SpecialText.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty SpecialTextProperty =
    DependencyProperty.Register("SpecialText", typeof(string), typeof(UcTest), new PropertyMetadata(new PropertyChangedCallback(SpecialTextChangedPropertyCallback)));

private static void SpecialTextChangedPropertyCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
    // Do something
    Debug.WriteLine("Ffgdgf");
}

好吧,我现在有一个用户控件,它有一些依赖属性。然而,这些属性与我的ViewModel属性完全分离(那些属性应该显示)。

所以基本上我有两种可能性:

  • 我现在如何告诉我的ViewModel UserControl某些属性已更改?
  • 是否有可能忘记依赖属性并直接访问视图模型?

其他信息#1: 我已经上传了一个(简单)示例,说明了我在这里要做的事情:Example Project。我想从我的MainViewViewModel更改UserControl1中的标签值(通过ViewConodel for UserControl1中的绑定属性)。

2 个答案:

答案 0 :(得分:5)

您通常会将{User}的属性bind发送到ViewModel属性。双向绑定可以在两个方向上工作,从ViewModel到View,反之亦然。

<Window x:Class="TestApplication.MainWindow" ...>
    <Window.DataContext>
        <local:MyViewModel/>
    </Window.DataContext>
    <Grid>
        <local:UcTest SpecialText="{Binding MyViewModelProperty, Mode=TwoWay}"/>
    </Grid>
</Window>

要在上面的示例中直接访问ViewModel对象,您只需将UserControl的DataContext属性转换为ViewModel类型即可。 DataContext继承自MainWindow。

var viewModel = DataContext as MyViewModel;
var property = viewModel.MyViewModelProperty;

您当然也可以直接将专门的ViewModel实例分配给UserControl的DataContext

<local:UcTest SpecialText="{Binding MyViewModelProperty, Mode=TwoWay}"/>
    <local:UcTest.DataContext>
        <local:UserControlViewModel/>
    </local:UcTest.DataContext>
</local:UcTest>

或者您可以将ViewModel实例创建为资源字典中的资源,并像这样分配DataContext

<local:UcTest DataContext="{StaticResource MyUserControlViewModel}"
              SpecialText="{Binding MyViewModelProperty, Mode=TwoWay}"/>

答案 1 :(得分:5)

好吧,经过数小时的谷歌搜索,似乎“正确”的方法根本不是这样做的。一般方法是将数据保存在MainViewModel中,而不是为UserControl使用额外的ViewModel(我发现它有点......好吧......不太好)。主要问题是没有简单的机制将数据从依赖属性获取到ViewModel。

对于打印,我现在已经回到纯粹的代码中了。