XAML {BINDING}构造非常方便,因为它会自动处理所有属性更改的问题。当您通过.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值。这可以正常工作,除非它没有无效 - ie,如果它更改了,ITGETTER上不会有更改通知。此外,如果更改foo.bar或bar.baz的参考文献,您也不会获得变化的noficiatiat。

我可以在属性上添加适当的iChangenotify代码,但是我的问题是:如何编码itgetter属性,以便当路径中的任何引用或IT值更改时,它将调用其属性交换事件?我希望我不必手动设置属性更改路径中所有项目的事件。

谢谢你的帮助!

埃里克

有帮助吗?

解决方案

你可以看看 依赖性属性. 。它们允许您在WPF属性系统中定义属性,这些属性用元数据和详细的值分辨率系统备份。

对您来说重要的是,他们允许您注册为已更改的属性事件注册,并且可以使您获得取决于其他内容的价值。

周围还有其他一些好的艺术品 乔什·史密斯(Josh Smith)基督教马索斯的“依赖性属性”

您可能还想阅读 依赖性属性回调和验证

其他提示

如Simon提到的那样,这是使用依赖属性的完整代码,它可以使用我要寻找的东西:

// 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)设置为null,则iTgetter的值将更改为false。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top