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属性完全分离(那些属性应该显示).
所以基本上我有两种可能性:
附加信息#1:我已经上传了一个(简单)示例,说明了我在这里要做的事情:示例项目.我想从我的MainViewViewModel更改UserControl1中的标签值(通过ViewConodel中的绑定属性,用于UserControl1).
您通常会将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)
好吧,经过数小时的谷歌搜索,看来“正确”的方法根本没有做到这一点。通用方法是将数据保留在MainViewModel中,而不对UserControl使用其他ViewModel(我发现有点...好吧..不太好)。主要问题在于,没有简单的机制可以将数据从Dependency属性获取到ViewModel。
对于打印,我现在回到纯粹用代码完成的工作。
| 归档时间: |
|
| 查看次数: |
10286 次 |
| 最近记录: |