سؤال

إن بنية 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!"; } }
}

إذا اتصلت بـ Itgetter على Foo ، فستحصل على قيمة IT من BAZ. هذا يعمل بشكل جيد ، إلا أنه لم يتم إبطاله-إذا تغير ، فلن يكون هناك أي إشعارات تغيير على Itgetter. علاوة على ذلك ، إذا تم تغيير مراجع foo.bar أو bar.baz ، فلن تحصل أيضًا على تغييرات التغيير.

يمكنني إضافة رمز IChangenotify المناسب على الخصائص ، لكن سؤالي هو: كيف يمكنني ترميز خاصية Itgetter بحيث ستسمي حدث PropertyChanged عندما يكون أي من المراجع في المسار ، أو تغيير قيمة تكنولوجيا المعلومات؟ آمل ألا أضطر إلى إعداد الممتلكات يدويًا تغيير الأحداث على جميع العناصر الموجودة في المسار ....

شكرا على اي مساعدة!

إريك

هل كانت مفيدة؟

المحلول

يمكنك إلقاء نظرة على خصائص التبعية. إنها تتيح لك تحديد الخصائص في نظام خاصية WPF المدعومة بمداخن من البيانات الوصفية ونظام حل القيمة التفصيلي.

الأهم من ذلك بالنسبة لك ، يسمحون لك بالسماح لك بالتسجيل في الأحداث التي تم تغييرها ، وتتيح لك جعل القيم تعتمد على أشياء أخرى.

هناك بعض Artcile الجيدة الأخرى حول مثل "إزالة الغموض عن خصائص التبعية" لجوش سميث و "خصائص التبعية" للمسيحين المسيحيين

قد ترغب أيضًا في القراءة عمليات الاسترجاعات والتحقق من الممتلكات التبعية

نصائح أخرى

فيما يلي الرمز الكامل الذي يقوم بما كنت أبحث عنه ، باستخدام خصائص التبعية ، كما ذكر سيمون:

// 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 تتغير إلى خطأ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top