0

我有一个 TabControl,用户控件位于 TabItem 内容中,如下所示:

\\...
<TabItem.Content>
<vm:myUserControl />
</TabItem.Content>
\\...
<TabItem.Content>
<vm:otherUserControl/>
</TabItem.Content>

myUserControl当我更改数据时如何更新otherUserControl(例如在列表中添加必须显示的元素 myUserControl)。此控件具有不同的数据上下文(来自不同的 viem 模型类,谁继承BaseViewModel. 谁推动INotifyPropertyChanged)。数据由 WCF 客户端服务提供。谢谢你的帮助。

4

2 回答 2

0

有多种方法可以实现这一目标。一种方法是触发一个事件otherUserControl并订阅你的事件MainWindow并允许你MainWindow更新myUserControl.

我的用户控件 XAML

<TextBlock x:Name="TextValue">Initial Text</TextBlock>

其他用户控件 XAML

<Button Click="Button_Click">Click Me</Button>

其他用户控件 C#

public event EventHandler ButtonClicked;

private void Button_Click(object sender, RoutedEventArgs e)
{
    if(this.ButtonClicked != null)
    {
        this.ButtonClicked(this, EventArgs.Empty);
    }
}

主窗口 XAML

<StackPanel>
    <vm:MyUserControl x:Name="MyUserControl"/>
    <vm:OtherUserControl x:Name="OtherUserControl"/>
</StackPanel>

主窗口 C#

public MainWindow()
{
    InitializeComponent();
    this.OtherUserControl.ButtonClicked += OtherUserControl_ButtonClicked;
}

void OtherUserControl_ButtonClicked(object sender, EventArgs e)
{
    this.MyUserControl.TextValue.Text = "Updated Text";
}

另一种选择是使用诸如Prism 事件聚合器之类的东西,它允许MyUserControl订阅由引发的事件,OtherUserControl而无需MainWindow设置两者之间的通信。对于大型项目,这是一个更好的选择,因为它允许您的组件真正松散耦合。

于 2012-07-09T13:59:24.687 回答
0

您可以使用 Mediator/Messenger 或 EventAggregator。因此您的 otherUsercontrol 引发消息/事件,并且您的 myUserControl 订阅并对此消息/事件作出反应。

或者,如果您不想松散耦合,您当然可以直接耦合您的两个视图模型并使用一些事件。

于 2012-07-09T13:58:07.397 回答