2012-07-09 49 views
0

我有一個TabControl和用戶控件是在TabItem的內容那樣:如何從代碼刷新自定義用戶控件在WPF背後或通過結合

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

如何更新myUserControl,當我在otherUserControl更改數據(例如添加列表中的元素,必須在myUserControl中顯示)。這個控件有不同的數據上下文(來自不同的viem模型類,誰繼承BaseViewModel。誰推動INotifyPropertyChanged)。數據由WCF客戶端服務提供。謝謝你的幫助。

回答

0

您可以使用調解器/ Messenger或EventAggregator。所以你的另一個用戶控件引發消息/事件,你的myUserControl訂閱並響應這個消息/事件。

或者如果你不想鬆散耦合,你當然可以直接耦合你的兩個視圖模型並使用一些事件。

+0

我用Mediator。奇蹟般有效。謝謝。 – Yuri 2012-07-09 15:49:35

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); 
    } 
} 

主窗口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 Event Aggregator這將使MyUserControl訂閱由OtherUserControl引發的事件,而不需要MainWindow設置通信兩者之間。這對於大型項目來說是一個更好的選擇,因爲它可以讓您的組件真正鬆散耦合。

+0

也謝謝你的回答 – Yuri 2012-07-09 19:55:18

相關問題