1

私は次の構造を持っています: Window1 -> UserControlA -> UserControlB -> UserControlC

それぞれに独自のビュー モデルがあります。UserControlC のプロパティに依存する UserControlA のプロパティを作成するにはどうすればよいですか?

私が考えることができる唯一のことは、C のプロパティ変更イベントを B から公開して、A からの C のイベントをリッスンし、A の依存関係プロパティを更新できるようにすることです。問題は、これがあまりにも不自然に思えることです。そのため、もっと簡単な解決策が必要だと思います。

4

3 に答える 3

1

できることは 2 つあります。

  1. 質問で述べたように、各親にその子を観察させます。

  2. RoutedEvents を使用する: C でRoutedEventを公開し、A で処理します。

編集

あなたの質問についてもっと考えた後:

バブルアップしたい C の ViewModel のプロパティである場合、RoutedEvents は UI コントロールでのみサポートされているため、最初のオプションのみを使用できます。

于 2012-04-26T04:28:14.450 に答える
1

これを実現するためにを連鎖Dependency Propertiesさせることができます。すべてのユーザー コントロールで dp を公開する必要があります。のプロパティをバインドUserControlCUserControlB、次にUserControlA. このように、プロパティ in が変更されるたびにUserControlC、プロパティ inUserControlAも変更されます。

A.xaml.cs

class VewModelA : INotifyPropertyChanged
{
    prop TextA {get {return thevalue;} set : set thevalue & RaisePropertyChanged("TextA")}
}

B.xaml.cs

class ViewModelB : INotifyPropertyChanged
{
    prop TextB {get {return thevalue;} set : set thevalue & RaisePropertyChanged("TextB")}
}

C.xaml.cs

class ViewModelC : INotifyPropertyChanged
{
    prop TextC {get {return thevalue;} set : set thevalue & RaisePropertyChanged("TextC")}
}

A.xaml

<controls:B TextB={Binding TextA, Mode=TwoWay}" />

B.xaml

<controls:C TextC={Binding TextB, Mode=TwoWay}" />

C のテキストが変更されるたびに、バインディングは TextA の値を更新します。そして間違いなく、dp をコントロール テンプレートの対応するビューモデル プロパティにマップする必要があります。

于 2012-04-26T08:07:31.110 に答える
0

簡単な解決策は、Prism http://compositewpf.codeplex.com/の一部として利用可能な EventAggregator メカニズムを使用することです。

于 2012-04-26T08:14:30.823 に答える