بررسی DataBinding در WPF


سیستم Data Binding در WPF یک راه ساده و قدرتمند برای نمایش و کار با داده ها را برای برنامه نویس فراهم می کند. کنترل های مختلف مثل Button و ListView به صورت توکار دارای قابلیت های قدرتمند Data Binding در WPF هستند که به برنامه نویس اجازه می دهد تا یک داده واحد یا مجموعه ای از داده ها را به خصوصیات یک کنترل Bind کند. قابلیت Data Binding در WPF  فواید زیادی نسبت به مدل های پیشین دارد، که از این فواید می توان به محدوده بیشتری از خصوصیات کنترل ها از data binding پشتیبانی می کنند، نمایش انعطاف پذیر داده ها در رابط کاربری و جداسازی شفاف منطق برنامه از رابط کاربری اشاره نمود.

مفهوم Data Binding

بدون در نظر گرفتن اینکه چه عنصری قرار است به چه منبع داده ای بایند شود، Data Binding همیشه مدل زیر را دنبال می کند :

Data Binding diagramشکل بالا مشخص می کند که عمل Data Binding مانند پلی است میان یک منبع داده و یک پراپرتی مقصد که البته همیشه دو طرفه نیست. به صورت معمول هر بایندینگ شامل چهار مولفه است : منبع داده، شیء مقصد، پراپرتی مقصد و مسیری در منبع داده که مقدار از آن خوانده می شود. به طور مثال اگر می خواهید پراپرتی Title در شیء Customer را در یک TextBox نمایش دهید، منبع داده شما شیء Customer، شیء مقصد نام آن TextBox، پراپرتی مقصد Text و مسیر منبع داده Title خواهند بود. پراپرتی مقصد باید یک Dependency Property باشد. بسیاری از پراپرتی های UIElement در WPF یک Dependency Property هستند و اکثر آن ها اگر read only نباشند، از data binding به صورت پیش فرض پشتیبانی می کنند.

جهت جریان داده ها

در WPF جریان داده در سیستم Data Binding می تواند یک طرفه (One Way)، دو طرفه (Two Way) و یا یک طرفه به سمت منبع (OneWayToSource) باشد. وجود این روش ها باعث می شود تا شما به عنوان یک برنامه نویس قادر به ساخت فرم های ورود داده بسیار انعطاف پذیر باشید. تنظیم حالت بایندینگ با تغییر پراپرتی Mode در آبجکت Binding مورد نظر قابل انجام است. شکل زیر به درک بهتر این روش ها کمک می کند :

Data flow directions

  • OneWay : تغییر در منبع داده باعث به روز رسانی پراپرتی مقصد می شود اما تغییر در پراپرتی مقصد باعث به روز رسانی منبع داده نخواهد شد. این حالت بایندینگ برای نمایش داده ها به صورت فقط خواندنی کاربرد دارد. به طور مثال شما می خواهید لیستی از محصولات را به مشتری نمایش دهید تا او بتوانید یکی از آن ها را انتخاب کند. این روش برای کنترل هایی که قابلیت ویرایش به کاربر نمی دهند (مثل ListView) کاربرد دارد.
  • TwoWay : تغییر در منبع داده باعث به روز رسانی پراپرتی مقصد و تغییر در پراپرتی مقصد باعث به روز رسانی منبع داده خواهد شد. این نوع بایندینگ مناسب فرم های ورود و ویرایش داده ها هستند که به صورت کامل با کاربر تعامل دارند. پیش فرض حالت بایندینگ اکثر پراپرتی ها حالت OneWay است اما برخی پراپرتی ها (مثل پراپرتی Text در TextBox) به صورت پیش فرض حالت TwoWay دارند.
  • OneWayToSource : این حالت برعکس حالت OneWay است به این صورت که با تغییر پراپرتی مقصد منبع داده به روز رسانی خواهد شد.
  • OneTime : برای مقدار دهی اولیه به پراپرتی مقصد بکار می رود. همانطور که از نامش پیداست فقط یک بار و برای اولین بار پراپرتی مقصد را مقدار دهی می کند و تغییرات بعدی منبع داده را بر روی پراپرتی مقصد اعمال نخواهد کرد. این حالت برای مواقعی مناسب است که منبع داده استاتیک است، یا در طول عمر یک شیء احتمال تغییر کردن آن وجود ندارد.

فقط توجه داشته باشید که برای اینکه در حالت های OneWay و TwoWay بتواند تغییرات را تشخیص دهد باید یک مکانیزم آگاه سازی تغییرات مثل INotifyPropertyChanged را برای منبع داده ها پیاده سازی کرده باشید.

چه زمانی منبع داده به روز خواهد شد؟

بایندینگ در حالت های TwoWay و OneWayToSource به تغییرات مقدار پراپرتی مقصد حساس می شوند و باید با تغییر مقدار در پراپرتی مقصد، منبع داده را آپدیت کنند. فرض کنید یک TextBox داریم که می خواهیم هنگامی کاربر مقدارش را تغییر داد، منبع داده ما بر اساس آن آپدیت شود. حال به نظر شما چه زمانی منبع داده باید آپدیت شود؟ بلافاصله بعد از اینکه کاراکترها را در TextBox وارد کرد یا هنگامی که کنترل Focus را از دست داد یا زمانی که کاربر بر روی یک Button کلیک کرد؟ پراپرتی UpdateSourceTrigger در بایندینگ مشخص می کند که چه زمانی منبع داده باید به روز رسانی شود. این پراپرتی می تواند یکی از چهار مقدار زیر باشد :

  • PropertyChanged : به محض اینکه مقدار پراپرتی تغییر کند، سورس آپدیت می شود.
  • LostFocus : زمانی که Focus کنترل به کنترل دیگری منتقل می شود، سورس آپدیت خواهد شد.
  • Default : حالت پیش فرض یک کنترل است که به طور مثال برای کنترل TextBox برابر LostFocus و برای کنترل CheckBox برابر PropertyChanged است.
  • Explicit : تا زمانی که متد UpdateSource صدا زده نشود، سورس آپدیت نخواهد شد.

اگر UpdateSourceTrigger یک TextBox را به PropertyChanged تغییر دهید ممکن است برنامه شما با مشکل مواجه شود، زیرا هر بار که کاربر کاراکتری را در TextBox وارد می کند منبع داده به روز رسانی خواهد شد و این سر بار زیادی (مخصوصاً اگر منبع داده دیتابیس باشد) به برنامه تحمیل خواهد کرد. در اکثر مواقع استفاده از Explicit مرقون به صرفه تر و بهتر از دیگر روش هاست، زیرا بهتر است تا کاربر دستور ذخیره را صادر نکرده، منبع داده به روز رسانی نشود.

یک مثال ساده

بهتر است یک مثال کوچک را برای درک بهتر موضوع اجرا کنید. یک اپلیکیشن WPF جدید بسیازید و کدهای XAML زیر را بین تگ های <Grid> و </Grid> پنجره خود قرار دهید :

<TextBox Name="textBox1" Width="167" />
<Label Content="{Binding ElementName=textBox1,Path=Text,UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" Name="label1" />

همانطور که مشاهده می کنید در اینجا پراپرتی Content (پراپرتی مقصد) از شیء label1 (شیء مقصد) را به پراپرتی Text (مسیر منبع داده) منبع داده (شیء textBox1) بایند کرده ایم و با تغییر UpdateSourceTrigger به PropertyChanged مشخص کرده ایم که به هنگام تایپ کردن کاربر در TextBox متن Label تغییر کند. اگر برنامه را اجرا کنید مشاهده خواهید کرد که با تایپ کاراکتر درون TextBox متن Label بلافاصله تغییر خواهد کرد.

farasun.wordpress.com

منبع این نوشته : MSDN

Subcribe to Farasun feedمشترک فراسان شويد

Advertisements