如何从代码隐藏或通过绑定刷新WPF中的自定义用户控件

时间:2012-07-09 13:40:02

标签: c# .net wpf wcf

我有一个TabControl,用户控件在TabItem内容中是这样的:

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

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

2 个答案:

答案 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}}设置两者之间的通信。对于大型项目来说,这是一个更好的选择,因为它允许您的组件真正松散耦合。