مفهوم Raisepropertychanged

SaraSheikhi

عضویت : 1397/07/10 پرسش ها : 2 پاسخ ها : 4

مفهوم Raisepropertychanged

ارسال شده در : ‫۲ ماه قبل، پنج شنبه ۲۳ آبان ۱۳۹۸، ساعت ۱۴:۲۵

سلام آقای باقرزاده 

می خواستم  بدونم مفهوم Raisepropertychanged دقیقا چیه؟ این متد  تغییرات رو از مدل به سمت اینترفیس انتقال میده یا برعکس؟ یا اصلا کارش چیزه دیگه ای هست؟

مرسی

سجاد باقرزاده

عضویت : 1396/09/12 پرسش ها : 0 پاسخ ها : 54

(پاسخ صحیح)

ارسال شده در :‫۲ ماه قبل، شنبه ۲۵ آبان ۱۳۹۸، ساعت ۱۰:۳۲

سلام

در بخش 17 دوره با نام " Mode Binding and Responding to change" توضیحاتی در همین رابطه داده شده است و مثال هایی رو براش زدم.

Raisepropertychanged همنطور که از روی نامش مشخصه، تغییرات مربوط به خصوصیات یا همون Property های کلاس ها رو به تمامی بخش هایی که از اون خصوصیت استفاده شده اعلام میکنه.

در WPF ما نوع Property هامون (DependencyProperty) تفاوت عمده ای با Property های معمولی داره که کامل در این باره توی همین دوره توضیح داده شده. یکی از ویژگی هاشون همین اعلام تغییر مقدار در خصوصیات است که در خصوصیات معمولی وجود ندارد. به همین منظور اینترفیسی وجود دارد به نام INotifyPropertyChanged که با پیاده سازی آن به کلاس یک Event و یک Method اضافه میکنند که با صدا زدن این متد زمان مقدار دهی یا بروز رسانی مقدار Property ها سریعا به بخش های مختلف برنامه که این خصوصیت وصل (Bind) می باشد اعلام میکند و دیگر نیازی به آپدیت کردن کل مدل یا لیستی که مدل در آن پر شده است نیست.

// This is a simple customer class that 
// implements the IPropertyChange interface.
public class DemoCustomer : INotifyPropertyChanged
{
    // These fields hold the values for the public properties.
    private Guid idValue = Guid.NewGuid();
    private string customerNameValue = String.Empty;
    private string phoneNumberValue = String.Empty;

    public event PropertyChangedEventHandler PropertyChanged;

    // This method is called by the Set accessor of each property.
    // The CallerMemberName attribute that is applied to the optional propertyName
    // parameter causes the property name of the caller to be substituted as an argument.
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    // The constructor is private to enforce the factory pattern.
    private DemoCustomer()
    {
        customerNameValue = "Customer";
        phoneNumberValue = "(312)555-0100";
    }

    // This is the public factory method.
    public static DemoCustomer CreateNewCustomer()
    {
        return new DemoCustomer();
    }

    // This property represents an ID, suitable
    // for use as a primary key in a database.
    public Guid ID
    {
        get
        {
            return this.idValue;
        }
    }

    public string CustomerName
    {
        get
        {
            return this.customerNameValue;
        }

        set
        {
            if (value != this.customerNameValue)
            {
                this.customerNameValue = value;
                NotifyPropertyChanged();
            }
        }
    }

    public string PhoneNumber
    {
        get
        {
            return this.phoneNumberValue;
        }

        set
        {
            if (value != this.phoneNumberValue)
            {
                this.phoneNumberValue = value;
                NotifyPropertyChanged();
            }
        }
    }
}

مثال بالا مربوط به سایت ماکروسافت است.

رویداد (Event) با نام PropertyChanged که از delegate ی با نام PropertyChangedEventHandler ساخته شده و توسط اینترفیس INotifyPropertyChanged پیاده سازی شده است در داخل متد NotifyPropertyChanged استفاده شده و وظیفه اعلام تغییرات را در همان لحظه تغییر به عهده دارد. ورودی این متد یک رشته است که می بایست نام پراپرتی باشد که متد در بدنه set آن قرار میگیرد. در این مثال نام پراپرتی ها بخاطر وجود Attribute ی با نام [CallerMemberName] نیاز به صدا زدن ندارد.

    public string CustomerName
    {
        get
        {
            return this.customerNameValue;
        }

        set
        {
            if (value != this.customerNameValue)
            {
                this.customerNameValue = value;
                NotifyPropertyChanged();
            }
        }
    }

 

0 تشکر

SaraSheikhi

عضویت : 1397/07/10 پرسش ها : 2 پاسخ ها : 4
ارسال شده در :‫۲ ماه قبل، سه شنبه ۲۸ آبان ۱۳۹۸، ساعت ۱۴:۰۹

ممنونم آقای باقرزاده از پاسخ کاملتون.

یک سوال دیگه ای داشتم که در  stackOwerFllow  پرسیدم ، ممنون میشم اگر نظری دارید بفرمایید .

لینک سوال

0 تشکر

سجاد باقرزاده

عضویت : 1396/09/12 پرسش ها : 0 پاسخ ها : 54
ارسال شده در :‫۲ ماه قبل، شنبه ۲ آذر ۱۳۹۸، ساعت ۱۷:۱۷

خواهش میکنم.

سوالتون تکراری بوده و براتون لینک سوال و پاسخ رو قرار دادن.

0 تشکر

SaraSheikhi

عضویت : 1397/07/10 پرسش ها : 2 پاسخ ها : 4
ارسال شده در :‫۲ ماه قبل، شنبه ۲ آذر ۱۳۹۸، ساعت ۱۷:۵۰

بله، تونستم با همون روش مشکلم رو حل کنم، من فکر میکردم شاید راه حل مستقیمی داشته باشه که گویا نداره. مرسی از توجهتون. 

0 تشکر

برای ارسال پاسخ باید وارد شوید و یا در سایت عضو شوید