ورود

View Full Version : یک کنترل چطوری از یک رویداد استفاده میکند؟؟



سیدسبحان
چهارشنبه 08 مهر 1394, 07:43 صبح
سلام اساتید بزرگوار
راستش من الان نزدیک دوماه هست که درگیر یادگیری mvvm هستم ولی هنوز که هنوزه نفهمیدم چطوری کار میکنه.

یکی از دلیلام هم این هست که مثلا وقتی در قسمت viewModel رویداد OnPropertyChange() رو فراخوانی میکنیم، خب من میفهمم که رویداد مقدارش تغییر کرده ولی چرا در قسمت view ، کنترل ما نمیاد این رویداد رو بررسی کنه که ببینه مقدار چی شده؟ منظورم اینه که من کدی رو نمیبینم که این عمل بررسی کردن رو انجام بده.
ما فقط توی تعریف پراپرتی های کلاس viewModel مون ، میام و این کد رو مینویسیم:

PropertyChanged(this, newPropertyChangedEventArgs(property));


ولی در بیرون ازین کلاس، جایی که ازین کلاس استفاده شده، اصلا کاری به این رویداد نداره.

من نمیفهمم!! یعنی همینطور خود کنترل علم غیب داره و میفهمه؟!

امیدوارم مشکلم رو متوجه شده باشید.
لطفا اگه کسی میدونه کمک کنه. دوماهه سردرگمم...

anubis_ir
چهارشنبه 08 مهر 1394, 10:07 صبح
نياز هست با مطالب binding دو طرفه (http://www.dotnettips.info/search/label/wpf) آشنا باشي.

SabaSabouhi
چهارشنبه 08 مهر 1394, 12:22 عصر
سلام اساتید بزرگوار
راستش من الان نزدیک دوماه هست که درگیر یادگیری mvvm هستم ولی هنوز که هنوزه نفهمیدم چطوری کار میکنه.

یکی از دلیلام هم این هست که مثلا وقتی در قسمت viewModel رویداد OnPropertyChange() رو فراخوانی میکنیم، خب من میفهمم که رویداد مقدارش تغییر کرده ولی چرا در قسمت view ، کنترل ما نمیاد این رویداد رو بررسی کنه که ببینه مقدار چی شده؟ منظورم اینه که من کدی رو نمیبینم که این عمل بررسی کردن رو انجام بده.
ما فقط توی تعریف پراپرتی های کلاس viewModel مون ، میام و این کد رو مینویسیم:

PropertyChanged(this, newPropertyChangedEventArgs(property));


ولی در بیرون ازین کلاس، جایی که ازین کلاس استفاده شده، اصلا کاری به این رویداد نداره.

من نمیفهمم!! یعنی همینطور خود کنترل علم غیب داره و میفهمه؟!

امیدوارم مشکلم رو متوجه شده باشید.
لطفا اگه کسی میدونه کمک کنه. دوماهه سردرگمم...

سلام
راستش پرسشت خیلی مبهم بود، اما اگه حدس من درست باشه مشکل از جایی هست که propertyها رو تعریف کردی.
کلاست باید INotifyPropertyChanged رو پیاده سازی کنه و تو propertyهایی که می‌خوای تغییرشون رو کنترل کنی باید
اینطوری کد بنویسی:

private int _myProperty;
public int MyProperty{
get{ return _myProperty; }
set{
if ( _myProperty == value ) return;
_myProperty = value;
OnPropertyChanged( "MyProperty" );
}
}

در غیر این صورت رویداد PropertyChanged فعال نمی‌شه.

اگه مشکلت همین بود که هیچ، در غیر این صورت کمی روشن‌تر توضیح بده تا من و دیگر دوستان بتونیم به‌تر راهنمایی کنیم.
در ضمن «استاد» واژه‌ی فارسی هست و شکسته جمع بسته نمی‌شه، خواهشمندم از «استادان» بجای اون «اساتید» استفاده کنی.

صبا صبوحی

سیدسبحان
چهارشنبه 08 مهر 1394, 14:17 عصر
سلام
راستش پرسشت خیلی مبهم بود، اما اگه حدس من درست باشه مشکل از جایی هست که propertyها رو تعریف کردی.
کلاست باید INotifyPropertyChanged رو پیاده سازی کنه و تو propertyهایی که می‌خوای تغییرشون رو کنترل کنی باید
اینطوری کد بنویسی:

private int _myProperty;
public int MyProperty{
get{ return _myProperty; }
set{
if ( _myProperty == value ) return;
_myProperty = value;
OnPropertyChanged( "MyProperty" );
}
}

در غیر این صورت رویداد PropertyChanged فعال نمی‌شه.

اگه مشکلت همین بود که هیچ، در غیر این صورت کمی روشن‌تر توضیح بده تا من و دیگر دوستان بتونیم به‌تر راهنمایی کنیم.
در ضمن «استاد» واژه‌ی فارسی هست و شکسته جمع بسته نمی‌شه، خواهشمندم از «استادان» بجای اون «اساتید» استفاده کنی.

صبا صبوحی


چرا انقدر منابع mvvm کم هست؟!!
با اینکه انقدر مهم هست ..
یه منبع فارسی گیر نمیاد قشنگ توضیح داده باشه.

elec60
پنج شنبه 09 مهر 1394, 11:17 صبح
بهترين راههاي پياده سازي INotifyPropertyChanged كه يكيشون روش حضرت اندرس هلزبرگ سلطان سي شارپ هست

http://danrigby.com/2012/01/08/inotifypropertychanged-the-anders-hejlsberg-way/

elec60
پنج شنبه 09 مهر 1394, 11:19 صبح
چرا انقدر منابع mvvm کم هست؟!!
با اینکه انقدر مهم هست ..
یه منبع فارسی گیر نمیاد قشنگ توضیح داده باشه..

تقريبا همه منابع فارسي مزخرف و به درد نخور هستن الا مطالبي كه آقاي وحيد نصيري تو سايتشون مينويسن كه واقعا بسيار عميق و در حد همون خارجيهاست

توصيه ميكنم مقالات آقاي Scott Hanselman رو كه MVVM ايده همين شخصه رو بخونين

همين طور خوندن مقالات Eric Lippert هم خيلي خيلي به درك عميق تر و مفهومي تره دات نت كمك ميكنه

براي مثال مطمعنم خيلي ها فرق واقعي x++ و ++x رو نميدونن و فكر ميكنن كه تو يكيش اول اضافه ميشه و بعد اعمال ميشه و تو اون يكي برعكس كه اصلا اين طور نيست. هر چند نتيجه اكثرا با اين توجيه درست در مياد اما كاملا شانسي و خود Eric Lippert مثالي زده كه نتيجه ش با اين توجيه نميخونه.

http://stackoverflow.com/questions/3346450/what-is-the-difference-between-i-and-i/3346729#3346729

سیدسبحان
جمعه 10 مهر 1394, 15:35 عصر
سلام
راستش پرسشت خیلی مبهم بود، اما اگه حدس من درست باشه مشکل از جایی هست که propertyها رو تعریف کردی.
کلاست باید INotifyPropertyChanged رو پیاده سازی کنه و تو propertyهایی که می‌خوای تغییرشون رو کنترل کنی باید
اینطوری کد بنویسی:

private int _myProperty;
public int MyProperty{
get{ return _myProperty; }
set{
if ( _myProperty == value ) return;
_myProperty = value;
OnPropertyChanged( "MyProperty" );
}
}

در غیر این صورت رویداد PropertyChanged فعال نمی‌شه.

اگه مشکلت همین بود که هیچ، در غیر این صورت کمی روشن‌تر توضیح بده تا من و دیگر دوستان بتونیم به‌تر راهنمایی کنیم.
در ضمن «استاد» واژه‌ی فارسی هست و شکسته جمع بسته نمی‌شه، خواهشمندم از «استادان» بجای اون «اساتید» استفاده کنی.

صبا صبوحی


میتونم یه سوال بپرسم؟

چرا در تابع زیر، رویداد رو بررسی میکنیم که ایا null باشه یا نه؟

private void onPropertyChanged(string propertyName) {
if (PropertyChanged == null) return;
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}

منظورم این هست که چه زمانی از null بودن خارج میشه و دوباره null میشه؟

یه سوال دیگه اینکه "وهله" چیه؟ میشه انگلیسیش رو بگید؟

SabaSabouhi
یک شنبه 12 مهر 1394, 08:54 صبح
میتونم یه سوال بپرسم؟

چرا در تابع زیر، رویداد رو بررسی میکنیم که ایا null باشه یا نه؟

private void onPropertyChanged(string propertyName) {
if (PropertyChanged == null) return;
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}

منظورم این هست که چه زمانی از null بودن خارج میشه و دوباره null میشه؟

یه سوال دیگه اینکه "وهله" چیه؟ میشه انگلیسیش رو بگید؟

سلام
از null خارج شدن هنگامی هست که شما تو یه کلاس دیگه یه تابع برای این کار اختصاص بدی. و معمولاً از null خارج نمی‌شه
مگه این که از =- استفاده کنی.

صبا صبوحی

سیدسبحان
یک شنبه 12 مهر 1394, 10:10 صبح
سلام
از null خارج شدن هنگامی هست که شما تو یه کلاس دیگه یه تابع برای این کار اختصاص بدی. و معمولاً از null خارج نمی‌شه
مگه این که از =- استفاده کنی.

صبا صبوحی

بعد دیه سوال:
چطوریه که توی کلاسایی که فقط پراپرتیشون تغییر میکنه و تابع خاصی رو نباید انجام بدن، مرتب بعد از هر عوض شدن مقدار پراپرتی، null نبودن بررسی میشه؟

SabaSabouhi
یک شنبه 12 مهر 1394, 11:48 صبح
بعد دیه سوال:
چطوریه که توی کلاسایی که فقط پراپرتیشون تغییر میکنه و تابع خاصی رو نباید انجام بدن، مرتب بعد از هر عوض شدن مقدار پراپرتی، null نبودن بررسی میشه؟

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


private string _name;
public string Name{
get { return _name; }
set {
if ( _name == value ) return;
_name = value;
OnPropertyChange( "Name" );
}
}

لایه‌ها در برنامه‌نویسی چند لایه روی هم قرار می‌گیرن و لایه‌های پایینی هیچ نوع دسترسی به لایه‌های بالاتر ندارن. این روشی هست
که هنگامی که یک property در لایه‌ی پایین تغییر می‌کنه بتونه به لایه‌ی بالایی خبر بده که این property عوض شده. تو لایه‌ی بالایی
یه eventhandler تعریف می‌کنیم که همون PropertyChanged هست. تو لایه‌ی پایینی اگه eventhandler تعریف نشده باشه همون حالتی
هست که مقدار null هست و اگه یک یا چند تا eventhandler تعریف شده باشه به ترتیب همه‌ی اون‌ها اجرا می‌شن.
تو WPF وقتی از Binding استفاده می‌کنی و نوع به‌روز رسانی رو تغییر Property تعریف می‌کنی ( که تو اغلب کنترل‌های موجود به همین
صورت هست ) اگه تو Property متد OnPropertyChanged رو فراخوانی نکرده باشی، کنترل متوجه تغییر پراپرتی نمی‌شه و طبیعی هست
که واکنش خاصی به تغییرات نشون نده و برنامه‌نویس تعجب می‌کنه که چرا با وجود binding تغییرات رو روی صفحه نمایش نمی‌بینه.

پس وجود این متد فقط برای این نیست که کار خاصی رو شما بخوای انجام بدی، بیشتر کاربردش تو binding هست.
اما پیش اومده که خود من تو 3 تا کلاس مختلف برای یک کلاس خواص eventhandler بنویسم و تغییر مقادیر خاصی رو تحت کنترل بگیرم.

صبا صبوحی