我有一个TabControl,用户控件在TabItem内容中是这样的:
\\...
<TabItem.Content>
<vm:myUserControl />
</TabItem.Content>
\\...
<TabItem.Content>
<vm:otherUserControl/>
</TabItem.Content>
如何更改myUserControl
中的数据时更新otherUserControl
(例如,列表中的元素必须显示在myUserControl
中)。此控件具有不同的datacontext(来自不同的viem模型类,谁继承BaseViewModel
。谁是impelments INotifyPropertyChanged
)。数据由WCF客户端服务提供。谢谢你的帮助。
答案 0 :(得分:0)
您可以使用Mediator / Messenger或EventAggregator。所以你的otherUsercontrol引发了消息/事件,你的myUserControl订阅并对这个消息/事件作出反应。
或者如果你不想松散耦合,你当然可以将你的两个视图模型直接耦合并使用某些事件。
答案 1 :(得分:0)
有很多方法可以实现这一目标。一种方法是在otherUserControl
中触发事件并在MainWindow
订阅该事件,并允许您的MainWindow
更新myUserControl
。
MyUserControl XAML
<TextBlock x:Name="TextValue">Initial Text</TextBlock>
OtherUserControl XAML
<Button Click="Button_Click">Click Me</Button>
OtherUserControl C#
public event EventHandler ButtonClicked;
private void Button_Click(object sender, RoutedEventArgs e)
{
if(this.ButtonClicked != null)
{
this.ButtonClicked(this, EventArgs.Empty);
}
}
MainWindow XAML
<StackPanel>
<vm:MyUserControl x:Name="MyUserControl"/>
<vm:OtherUserControl x:Name="OtherUserControl"/>
</StackPanel>
MainWindow C#
public MainWindow()
{
InitializeComponent();
this.OtherUserControl.ButtonClicked += OtherUserControl_ButtonClicked;
}
void OtherUserControl_ButtonClicked(object sender, EventArgs e)
{
this.MyUserControl.TextValue.Text = "Updated Text";
}
另一种选择是使用Prism Event Aggregator之类的内容,MyUserControl
允许OtherUserControl
订阅由MainWindow
引发的事件,而无需{{1}}设置两者之间的通信。对于大型项目来说,这是一个更好的选择,因为它允许您的组件真正松散耦合。