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

Mediator/MessengerまたはEventAggregatorを使用できます。したがって、otherUsercontrolはメッセージ/イベントを発生させ、myUserControlはこのメッセージ/イベントをサブスクライブして反応します。

または、緩い結合が必要ない場合は、もちろん2つのビューモデルを直接結合してイベントを使用することもできます。

于 2012-07-09T13:58:07.397 に答える
0

これを実現する方法はいくつかあります。1つの方法は、でイベントを発生otherUserControlさせ、でそのイベントをサブスクライブして、を更新MainWindowできるようにすることです。MainWindowmyUserControl

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

もう1つのオプションは、Prism Event Aggregatorのようなものを使用することです。これにより、2つの間の通信をセットアップしなくても、MyUserControlによって発生したイベントをサブスクライブできます。これは、コンポーネントを本当に緩く結合できるため、大規模なプロジェクトでははるかに優れたオプションです。OtherUserControlMainWindow

于 2012-07-09T13:59:24.687 に答える