1

XAML {Binding}構造は、PropertyChangedのすべての問題を自動的に処理するため、非常に便利です。.NETデータ構造を介してオブジェクトへのパスを渡すと、本当に印象的です。すべてが自動的に更新されます。

C#でも同じものを使いたいです。別のプロパティの値から派生したプロパティが欲しいのですが。例

class Foo
{
    public Bar Bar = new Bar();
    public string ItGetter
    {
        get
        {
            return Bar.Baz.It;
        }
    }
}

class Bar
{
    public Baz Baz = new Baz();
}

class Baz
{
    public string It { get { return "You got It!"; } }
}

FooでItGetterを呼び出すと、BazからIt値を取得します。これは、無効化されないことを除いて、正常に機能します。つまり、変更された場合、ItGetterに変更通知はありません。さらに、Foo.BarまたはBar.Bazの参照が変更された場合、変更の通知も受け取りません。

プロパティに適切なIChangeNotifyコードを追加できますが、質問は次のとおりです。パス内の参照のいずれか、またはIt値が変更されたときにPropertyChangedイベントを呼び出すように、ItGetterプロパティをコーディングするにはどうすればよいですか。パス内のすべてのアイテムでプロパティ変更イベントを手動で設定する必要がないことを願っています。

助けてくれてありがとう!

エリック

4

2 に答える 2

1

依存関係のプロパティを確認できます。これらを使用すると、メタデータのスタックと詳細な値解決システムに裏打ちされたWPFプロパティシステムのプロパティを定義できます。

重要なのは、プロパティ変更イベントに登録できるようにし、値を他のものに依存させることができるようにすることです。

JoshSmithによる「依存関係プロパティの謎解き」ChristianMosersによる「依存関係プロパティ」など、他にも優れたアーティクルがいくつかあります。

依存関係プロパティのコールバックと検証もお読みください。

于 2010-04-27T21:32:04.153 に答える
1

サイモンが述べたように、依存関係プロパティを使用して、私が探していたことを実行する完全なコードを次に示します。

// This class exists to encapsulate the INotifyPropertyChanged requirements
public class ChangeNotifyBase : DependencyObject, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string property)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(property));
    }
}

public class Foo : ChangeNotifyBase
{
    public Foo()
    {
        Bar = new Bar();
        var binding = new Binding("Bar.Baz.It");
        binding.Source = this;
        binding.Mode = BindingMode.TwoWay;
        BindingOperations.SetBinding(this, ItGetterProperty, binding);
    }

    /// <summary>
    /// The ItGetter dependency property.
    /// </summary>
    public bool ItGetter
    {
        get { return (bool)GetValue(ItGetterProperty); }
        set { SetValue(ItGetterProperty, value); }
    }
    public static readonly DependencyProperty ItGetterProperty =
        DependencyProperty.Register("ItGetter", typeof(bool), typeof(Foo));

    // Must do the OnPropertyChanged to notify the dependency machinery of changes.
    private Bar _bar;
    public Bar Bar { get { return _bar; } set { _bar = value; OnPropertyChanged("Bar"); } }
}

public class Bar : ChangeNotifyBase
{
    public Bar()
    {
        Baz = new Baz();
    }
    private Baz _baz;
    public Baz Baz { get { return _baz; } set { _baz = value; OnPropertyChanged("Baz"); } }
}

public class Baz : ChangeNotifyBase
{
    private bool _it;
    public bool It { get { return _it; } set { _it = value; OnPropertyChanged("It"); } }
}

ItGetter のイベントに登録すると、次のいずれかが変更された場合に通知されます: Baz.It Foo.Bar (つまり、参照を変更します) Bar.Baz " "

オブジェクト参照 (Foo.Bar または Bar.Baz) の on を null に設定すると、ItGetter の値が false に変更されます。

于 2010-04-29T16:32:24.223 に答える