[Wpf] كيفية رفع الممتلكات تغير الأحداث على الملكية التبعية؟


Answers

واجهت مشكلة مماثلة حيث لدي الملكية التبعية التي أردت الطبقة للاستماع إلى تغيير الأحداث لانتزاع البيانات ذات الصلة من الخدمة.

public static readonly DependencyProperty CustomerProperty = 
    DependencyProperty.Register("Customer", typeof(Customer),
        typeof(CustomerDetailView),
        new PropertyMetadata(OnCustomerChangedCallBack));

public Customer Customer {
    get { return (Customer)GetValue(CustomerProperty); }
    set { SetValue(CustomerProperty, value); }
}

private static void OnCustomerChangedCallBack(
        DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
    CustomerDetailView c = sender as CustomerDetailView;
    if (c != null) {
        c.OnCustomerChanged();
    }
}

protected virtual void OnCustomerChanged() {
    // Grab related data.
    // Raises INotifyPropertyChanged.PropertyChanged
    OnPropertyChanged("Customer");
}
Question

موافق، لذلك لدي هذه السيطرة مع اثنين من الخصائص. واحدة من هذه هي ديبندنسيبروبيرتي، والآخر هو "الاسم المستعار" إلى أول واحد. ما أحتاجه لتكون قادرة على القيام به هو رفع الحدث بروبيرتيتشانجيد للثانية (الاسم المستعار) عندما يتم تغيير الأول.

ملاحظة : أنا باستخدام ديبندنسيوبجيكتس، لا إينوتيفيبروبيرتيشانجيد (حاول ذلك، لم يعمل لأن عنصر التحكم الخاص بي هو ليستفيو فئة فرعية)

شيء من هذا القبيل.....

protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
{
    base.OnPropertyChanged(e);
    if (e.Property == MyFirstProperty)
    {
        RaiseAnEvent( MySecondProperty ); /// what is the code that would go here?
    }    
}

إذا كنت تستخدم إينوتيفي يمكن أن أفعل مثل هذا ...

public string SecondProperty
{
    get
    {
        return this.m_IconPath;
    }
}

public string IconPath
{
    get
    {
        return this.m_IconPath;
    }
    set
    {
        if (this.m_IconPath != value)
        {
            this.m_IconPath = value;
        this.SendPropertyChanged("IconPath");
        this.SendPropertyChanged("SecondProperty");
        }
    }
}

حيث يمكنني رفع بروبيرتيشانجد الأحداث على خصائص متعددة من واضعة واحدة. أنا بحاجة إلى أن تكون قادرة على القيام بنفس الشيء، إلا باستخدام ديبندنسيبروبيرتيز.




أنا أتفق مع سام و زيسر وقد اتخذت فعلا هذا أبعد قليلا. لا أعتقد أنك يجب أن تنفذ واجهة إينوتيفيبروبيرتيتشانجيد في وسيركونترول على الإطلاق ... عنصر التحكم هو بالفعل ديبندنسيوبجيكت وبالتالي يأتي بالفعل مع الإخطارات. إضافة إينوتيفيبروبيرتيتشانجيد إلى ديبندنسيوبجيكت زائدة عن الحاجة و "الروائح" خاطئة بالنسبة لي.

ما فعلته هو تنفيذ كل من الخصائص كما ديبندنسيبروبيرتيز، كما يوحي سام، ولكن بعد ذلك ببساطة كان بروبيرتيشانجدكالباك من الخاصية "أولا" التبعية تغيير قيمة "الثانية" التبعية الخاصية. وبما أن كلا من خصائص الإعالة، فإن كلا الأمرين سيؤديان تلقائيا إلى رفع إشعارات التغيير إلى أي مشتركين مهتمين (مثل ربط البيانات وما إلى ذلك)

في هذه الحالة، الخاصية التبعية A هي سلسلة إنفيتيتكست، الذي يؤدي إلى تغيير في الخاصية التبعية B، الخاصية الرؤية اسمه شوينفيت. هذا سيكون حالة استخدام شائعة إذا كان لديك بعض النص الذي تريد أن تكون قادرة على إخفاء تماما في عنصر تحكم عن طريق ربط البيانات.

    public string InviteText  
    {
        get { return (string)GetValue(InviteTextProperty); }
        set { SetValue(InviteTextProperty, value); }
    }

    public static readonly DependencyProperty InviteTextProperty =
        DependencyProperty.Register("InviteText", typeof(string), typeof(InvitePrompt), new UIPropertyMetadata(String.Empty, OnInviteTextChanged));

    private static void OnInviteTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        InvitePrompt prompt = d as InvitePrompt;
        if (prompt != null)
        {
            string text = e.NewValue as String;
            prompt.ShowInvite = String.IsNullOrWhiteSpace(text) ? Visibility.Collapsed : Visibility.Visible;
        }
    }

    public Visibility ShowInvite
    {
        get { return (Visibility)GetValue(ShowInviteProperty); }
        set { SetValue(ShowInviteProperty, value); }
    }

    public static readonly DependencyProperty ShowInviteProperty =
        DependencyProperty.Register("ShowInvite", typeof(Visibility), typeof(InvitePrompt), new PropertyMetadata(Visibility.Collapsed));

ملاحظة أنا لا تشمل توقيع وسيركونترول أو منشئ هنا لأنه لا يوجد شيء خاص عنها؛ فإنها لا تحتاج إلى الفئة الفرعية من إينوتيفيبروبيرتيشانجد على الإطلاق.