在我目前的场景(WPF,MVVM)中,我有一个托管visio图的用户控件。此用户控件位于视图上,旁边是许多标签和datagrid元素。
用户控件包含DependencyProperty对象SelectedNode
,该值使用从Visio图表接收的信息进行更新。标签的内容已绑定,以便显示SelectedNode
中包含的信息(例如,ID,名称):
<Label Grid.Row="1" Grid.Column="1" x:Name="lbNodeIdValue" HorizontalAlignment="Left"
Content="{Binding ElementName=visioControlUC, Path=SelectedNode.Id, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}"/>
每次更改图表中的选择时,标签的内容都会按预期更改。
在此标签旁边,我想显示一个包含基于标签中显示的ID的信息的数据网格。这是我遇到问题的地方,因为我似乎无法在viewmodel类中获取标签的Content
属性的值。
我尝试在标签的MultiBinding
元素上使用Content
属性,并使用Mode=OneWayToSource
创建第二个绑定,以将标签Content
的值设置为我在viewmodel类中定义的属性。
在viewmodel类中检索此值的正确方法是什么?
谢谢, 阿德里安
答案 0 :(得分:1)
理想情况下,您的Datagrid的ViewModel
应该从另一个ViewModel
获取所选标签的值。您不应该依赖Views
在ViewModels
之间传输应用程序数据。
听起来SelectedNode
值来自UserControl
,而不是ViewModel
,因此您需要将UserControl.SelectedNodeId
绑定到ViewModel
某处,因此ViewModel可以访问此数据
<local:myUserControl x:Name="visioControlUC"
SelectedNode="{Binding SelectedNodeId}" />
如果多个ViewModel
需要该值,我强烈推荐某种事件系统,例如MVVM Light的Messenger
或Prism的EventAggregator
。这样,您的ViewModels
就可以订阅类似SelectedNodeChangedEventMessage
的内容,实际包含ViewModel
的{{1}}可以在值发生变化时随时广播该消息。你可以在我的博文中找到关于Communication between ViewModels的一个例子。