Frage

Die XAML {Binding} Konstrukt ist sehr praktisch, weil es all die Property Probleme automatisch behandelt. Es ist wirklich beeindruckend, wenn man es einen Pfad zu einem Objekt übergeben, durch Strukturen .NET Daten, und alles wird automatisch aktualisiert.

Ich möchte die gleiche Sache in C # verwenden. Ich möchte eine Eigenschaft haben, die von dem Wert einer anderen Eigenschaft abgeleitet wird. Beispiel

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

Wenn Sie ItGetter auf einem Foo aufrufen, erhalten Sie die es Wert von Baz. Dies funktioniert gut, außer dass es nicht für ungültig erklärt wird - d. H, wenn es geändert wird, gibt es keine Änderungsbenachrichtigungen auf dem ItGetter wäre. Wenn darüber hinaus die Foo.Bar oder Bar.Baz Referenzen geändert werden, würden Sie auch nicht ändern noficiations bekommen.

kann ich den entsprechenden IChangeNotify Code auf den Eigenschaften hinzufügen, aber meine Frage ist: Wie code ich die ItGetter Eigenschaft, dass es sein Property Ereignis, wenn eine der Referenzen in dem Weg nennen, oder ändern Sie den Wert It? Ich hoffe, dass ich nicht auf alle Elemente in der Pfad zum manuellen Setup-Eigenschaft geändert Ereignisse haben ....

Vielen Dank für jede Hilfe!

Eric

War es hilfreich?

Lösung

Sie können einen Blick auf dependancy Eigenschaften . Sie ermöglichen es, Objekte in WPF-Eigenschaftensystem zu definieren, die mit Stapeln von Metadaten und einer detaillierten Wertauflösung System unterstützt werden.

Wichtig ist für Sie sie erlauben sie ermöglichen es Ihnen für Eigenschaft geändert Ereignisse zu registrieren, und sie ermöglichen es Ihnen Werte abhängig von anderen Sachen zu machen.

Es gibt einige andere gute artcile um wie 'Entmystifizierung Abhängigkeit Eigenschaften von Josh Smith und 'Abhängigkeit Eigenschaften' von Christian Mosers

Sie können auch Abhängigkeitseigenschaft Rückrufe und Validierung lesen möchten

Andere Tipps

Hier ist der vollständige Code, der tut, was ich suchte, mit Abhängigkeitseigenschaften, wie Simon erwähnt:

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

Wenn Sie jetzt für Veranstaltungen auf ItGetter registrieren, Sie werden benachrichtigt, wenn alle diese Dinge zu ändern: Baz.It Foo.Bar (das heißt, die Referenz aus) Bar.Baz "„

Wenn Sie die Objektreferenzen setzen auf (Foo.Bar oder Bar.Baz) auf null, wird der Wert von ItGetter ändert sich auf false gesetzt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top