5

好吧,这与这个问题有些相关: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 属性完全分开(那些是应该显示的)。

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

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

附加信息#1:我已经上传了一个(简单)我在这里尝试做的例子:Example Project。我想从我的 MainViewViewModel 更改 UserControl1 中标签的值(通过 UserControl1 的 ViewModel 中的绑定属性)。

4

2 回答 2

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>

要直接访问上例中的 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}"/>
于 2013-03-02T15:50:41.417 回答
5

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

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

于 2013-03-05T14:56:12.680 回答