好的,这与这个问题有些相关: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属性完全分离(那些属性应该显示)。
所以基本上我有两种可能性:
其他信息#1: 我已经上传了一个(简单)示例,说明了我在这里要做的事情:Example Project。我想从我的MainViewViewModel更改UserControl1中的标签值(通过ViewConodel for UserControl1中的绑定属性)。
答案 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。
对于打印,我现在已经回到纯粹的代码中了。