برنامج الأغذية العالمي: منعش تحكم مع خاصية ملزمة باستخدام نموذج عرض الموديل

StackOverflow https://stackoverflow.com/questions/1046956

سؤال

وأنا باستخدام نموذج عرض نمط عرض الموديل لتطبيق WPF. لدي ViewModel (مجموعة كما صفحات DataContext) مع اثنين من خصائص، واحد منها هو الكيان مع حدث PropertyChanged. في معالج الأحداث ط تعيين قيمة الممتلكات الأخرى (منطقي) لبعض القيمة.

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

ووViewModel يبدو شيء على مثل هذا:

public sealed class CustomerPageViewModel
{ 
    public Customer Customer
    {
        get;
        set;
    }

    public bool Editing
    {
        get;
        private set;
    }   

    private void Customer_PropertyChanged(object sender,
        System.ComponentModel.PropertyChangedEventArgs e)
    {
        Editing = true;
    }
}

وعلى XAML يبدو شيء على مثل هذا:

<TextBox Text="{Binding Customer.Name}" />   
<Button Content="Save Changes" IsEnabled="{Binding Editing}" />

وكيف يمكنني الحصول على زر لتحديث خاصية IsEnable لها عندما تغيير الخاصية الأساسية في ViewModel؟

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

المحلول

هل هذا الرمز الفعلي ViewModel الخاص بك؟ إذا كان الأمر كذلك، المشكلة هي أن ViewModel الخاص بك لا تنفيذ INotifyPropertyChanged. WPF لا نستطيع أن نعرف بأن ما تتمتعون به خاصية "التحرير" VM لم يتغير حتى انها ليست تحديث الزر ملزمة.

نصائح أخرى

عند Editing مجموعات الرمز إلى true، لا يظهر لتشغيل الحدث PropertyChanged، وبالتالي فإن Button ليس لديه فكرة أنه يجب تحديث ملزمة لIsEnabled. جرب شيئا من هذا القبيل:

public sealed class CustomerPageViewModel : INotifyPropertyChanged
{ 
    public Customer Customer
    {
        get;
        set;
    }

    private bool editing = false;
    public bool Editing
    {
        get { return editing; }
        private set
        {
            editing = value;
            Customer_PropertyChanged(this, new PropertyChangedEventArgs("Editing");
        }
    }   

    public event PropertyChangedEventHandler PropertyChanged;
    private void Customer_PropertyChanged(object sender,
        System.ComponentModel.PropertyChangedEventArgs e)
    {
        PropertyChanged(this, e);

        if(!e.PropertyName.Equals("Editing"))
        {
            Editing = true;
        }
    }
}

لاحظ أنه يجب التحقق من أن Editing لم يسبب حالة PropertyChanged لاطلاق النار، وإلا ستحصل حلقة لا نهائية.

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