2

モデルにバインドしたいコントロールを含む WPF ウィンドウがあります。このモデルは INotifyPropertyChanged を実装して、Properties の値が変更されたときにビューに通知します。プロパティは、フィールドに基づくプリミティブです。たとえば、次のとおりです。

private bool m_isRunning;
public bool IsRunning
{
    get { return m_isRunning; }
    private set
    {
        m_isRunning= value;
        OnPropertyChanged("IsRunning");
    }
}

protected virtual void OnPropertyChanged(string propertyName)
{
    if (String.IsNullOrEmpty(propertyName))
    {
        return;
    }
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

これは、プリミティブ値に対してはうまく機能します。また、さまざまなプリミティブ プロパティとハッシュ テーブルを持つ複合オブジェクトもあります。または、ObservableCollection の Count プロパティにバインドしたいと思います。ビュー コントロールを複合オブジェクト内のプロパティにバインドしたいのですが、これは可能ではないと思います。何かのようなもの:

       <Run Text="{Binding Path=CompositeObject.SomeInnerProperty, Mode=OneWay,  UpdateSourceTrigger=PropertyChanged}" />

無理そうですが、他に方法はありませんか?私の唯一のオプションは、複合オブジェクトの内部プロパティにマップするプロパティを公開することだと思いますが、これは多くの繰り返しのようです。

public bool SomeInnerProperty
{
    get { return m_myComposite.SomeInnerProperty; }
    private set
    {
        m_myComposite.SomeInnerProperty= value;
        OnPropertyChanged("SomeInnerProperty");
    }
}
4

2 に答える 2

0

私はしばらく前にこの同じ問題を抱えていました。私がそれを解決した方法を見てください: MVVM INotifyPropertyChanged conflict with base class PropertyChange

基本的に、INotifyPropertyChanged を実装する基本クラスを作成し、すべてのクラスをその基本クラスから継承させ、データ バインディングが正常に機能するようにしました。

次の 2 つのオプションがあります。

  1. モデル クラスが INPC を実装していない場合は、提案したように ViewModel にラッパー プロパティを作成するか、
  2. モデルに INPC を実装し、ViewModel でメイン オブジェクトを公開するだけで、内部プロパティが変更を通知する限り、好きなだけ深くバインドできます。
于 2013-04-01T17:50:06.943 に答える