MVVM +用户控件+依赖项属性(MVVM + UserControl + Dependency P

2019-08-17 06:11发布

好吧,这是一定的相关性这个问题: 从一个单一的视图模型WPF打印多页

我试图按照给那里的意见,但现在我卡住了。

我的应用程序使用MainView.xaml和适当MainViewViewModel.cs,我在后台使用MVVM光。

现在 - 根据岗位 - 看来我必须做到以下几点:

  • 创建用户控件
  • 暴露来自用户控制的一些性质
  • 确保视图模型显示这些属性

这个想法是明确的,但试图通知对方,当我卡住了。

我的用户控件(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属性(这些都是其将被显示的)分离。

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

  • 我怎么能现在就告诉我的用户控件视图模型某些属性有哪些变化?
  • 有没有忘了依赖属性和直接访问视图模型的可能性?

附加信息#1:我已上载的是什么,我想在这里做一个(简单的)例子: 示例项目 。 我想改变的UserControl1标签的值(通过视图模型进行的UserControl1绑定属性)从我MainViewViewModel。

Answer 1:

您通常会绑定的用户控件的属性视图模型属性。 双向绑定在两个方向上会的工作,从视图模型查看,反之亦然。

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

要直接访问在上面的例子中视图模型对象,你可以简单地将用户控件的演员DataContext属性视图模型类型。 在DataContext从主窗口继承。

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

你当然也可以直接指定一个专门的视图模型实例的用户控件的DataContext

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

或者您可以创建视图模型实例作为一个资源字典中的资源并分配这样在DataContext

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


Answer 2:

好吧,谷歌上搜索了几个小时之后,似乎“正确”的方式,这是不这样做的。 一般的方法是保持数据在MainViewModel,而不是使用的用户控件的附加视图模型(我觉得这有点...好..不太好)。 主要的问题是,有没有简单的机制来从依赖属性到视图模型得到的数据。

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



文章来源: MVVM + UserControl + Dependency Property