Question

Le XAML {} Reliure construction est très pratique car il gère tous les problèmes PropertyChanged automatiquement. Il est vraiment impressionnant quand vous lui donnez une voie à un objet, à travers des structures de données .NET, et tout est mis à jour automatiquement pour vous.

Je voudrais utiliser la même chose en C #. Je voudrais avoir une propriété qui est dérivé de la valeur d'une autre propriété. Exemple

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

Si vous ItGetter appelez sur un Foo, vous obtenez la valeur de Baz Il. Cela fonctionne très bien, sauf qu'il ne soit pas invalidée -. I.e., si elle a changé, il n'y aurait pas des notifications de modification du ItGetter. En outre, si les références foo.bar ou Bar.Baz sont modifiés, vous aussi ne pas obtenir noficiations de changement.

Je peux ajouter le code IChangeNotify approprié sur les propriétés, mais ma question est: Comment puis-je code la propriété ItGetter telle qu'elle appellera son événement PropertyChanged lorsque l'une des références dans le chemin, ou le changement de valeur Il? J'espère que je n'ai pas la propriété de configuration manuelle des événements ont changé sur tous les éléments du chemin ....

Merci pour toute aide!

Eric

Était-ce utile?

La solution

Vous pouvez jeter un oeil à propriétés dépendance. Ils vous permettent de définir des propriétés dans le système de propriété WPF qui sont sauvegardées avec des piles de métadonnées et un système détaillé de résolution de valeur.

Il est important pour vous, ils ils vous permettent permettent d'enregistrer des événements ont changé de propriété, et ils vous permettent de faire des valeurs dépendantes d'autres choses.

Il y a une autre bonne artcile autour, comme 'Démystifier dépendance propriétés par Josh Smith et 'propriétés de dépendance' par Christian Mosers

Vous pouvez également lire propriété de dépendance et validation Callbacks

Autres conseils

Voici le code complet qui fait ce que je cherchais, en utilisant des propriétés de dépendance, comme Simon dit:

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

Si vous vous inscrivez dès maintenant pour les événements sur ItGetter, vous serez informé si l'une de ces choses changent:   Baz.It   Foo.Bar (à savoir, transfert de référence)   Bar.Baz " «

Si vous définissez sur des références d'objet (foo.bar ou Bar.Baz) à null, la valeur de ItGetter change false.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top