MVVM + UserControl +依赖属性

Tom*_* L. 5 wpf user-controls dependency-properties mvvm

好吧,这与这个问题有些相关:WPF从单个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");
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

附加信息#1:我已经上传了一个(简单)示例,说明了我在这里要做的事情:示例项目.我想从我的MainViewViewModel更改UserControl1中的标签值(通过ViewConodel中的绑定属性,用于UserControl1).

Cle*_*ens 5

您通常会将UserControl的属性绑定到ViewModel属性.双向绑定可以在两个方向上工作,从ViewModel到View,反之亦然.

<Window x:Class="TestApplication.MainWindow" ...>
    <Window.DataContext>
        <local:MyViewModel/>
    </Window.DataContext>
    <Grid>
        <local:UcTest SpecialText="{Binding MyViewModelProperty, Mode=TwoWay}"/>
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

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

var viewModel = DataContext as MyViewModel;
var property = viewModel.MyViewModelProperty;
Run Code Online (Sandbox Code Playgroud)

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

<local:UcTest SpecialText="{Binding MyViewModelProperty, Mode=TwoWay}"/>
    <local:UcTest.DataContext>
        <local:UserControlViewModel/>
    </local:UcTest.DataContext>
</local:UcTest>
Run Code Online (Sandbox Code Playgroud)

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

<local:UcTest DataContext="{StaticResource MyUserControlViewModel}"
              SpecialText="{Binding MyViewModelProperty, Mode=TwoWay}"/>
Run Code Online (Sandbox Code Playgroud)


Tom*_* L. 5

好吧,经过数小时的谷歌搜索,看来“正确”的方法根本没有做到这一点。通用方法是将数据保留在MainViewModel中,而不对UserControl使用其他ViewModel(我发现有点...好吧..不太好)。主要问题在于,没有简单的机制可以将数据从Dependency属性获取到ViewModel。

对于打印,我现在回到纯粹用代码完成的工作。