7467


WPFのデータバインディングについて、特に階層構造を持つViewModelをバインドする場合の仕組みについて教えて下さい。

ViewModel定義

[code]

    public class Outer : INotifyPropertyChanged {
        public Inner Inner { /* get,setのコードは省略 */ }
    }
    
    public class Inner : INotifyPropertyChanged {
        public string Hoge { /* get,setのコードは省略 */ }
    }
    
[/code]

XAML

[code]

    <Window.DataContext>
        <vm:Outer/>
    </Window.DataContext>
    
    <Grid>
        <TextBox Text="{Binding Inner.Hoge}"/>
    </Grid>
    
[/code]

上記のようなコードであるとき、`TextBox`は`Inner`インスタンスの`PropertyChanged`イベントを直接的に監視しているのでしょうか？  
それとも`DataContext`で指定されている`Outer`インスタンスの`PropertyChanged`イベントを監視しているのでしょうか？


CC BY-SA 3.0
2015-03-05T04:24:31.607
7466
2015-03-05T08:41:56.217
8078
question
wpf xaml
WPFにおける階層構造を持ったViewModelに対するデータバインディングの仕組み


実際に`Outer`と`Inner`の`PropertyChanged`へイベントハンドラを追加して検証しました。

[code]

    public class Outer : INotifyPropertyChanged
    {
        public Outer()
        {
            // _innerはInnerプロパティ内で参照するprivateメンバ
            _inner = new Inner();
            _inner.PropertyChanged +=new PropertyChangedEventHandler(_inner_PropertyChanged);
            this.PropertyChanged += new PropertyChangedEventHandler(Outer_PropertyChanged);
        }
        private void _inner_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            Console.WriteLine("Inner: " + e.PropertyName);
        }
        private void Outer_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            Console.WriteLine("Outer: " + e.PropertyName);
        }
        //...
    }
    
[/code]

ここで`Inner.Hoge`の値を変更してみますと`Inner`側しか発火していませんでした。`TextBox`の表示は正しく更新されました。(素直に実装すれば`Outer`の`PropertyChanged`は`Inner`自体を変更しないと発火しないようになると考えます。)

よって、`TextBox`の更新に関係しているのは`Inner`側の`PropertyChanged`だと考えました。


CC BY-SA 3.0
2015-03-05T05:17:50.307
7467
2015-03-05T08:41:56.217
2015-03-05T08:41:56.217
3313
3313
7466
answer