سوئیچ کردن بین Viewها در WPF هنگام استفاده از الگوی MVVM
مصطفی ستاری | پنجشنبه, ۳۱ ارديبهشت ۱۳۹۴، ۰۵:۴۱ ب.ظ |
۰ نظر
یکی از مسائلی که در ابتدای کار با MVVM ممکن است گیج کننده به نظر برسد سوئیچ کردن بین نماهای مختلف (Views) است.
برای اینکار چند روش وجود دارد.
استفاده از DataTemplate
فرض کنید در پنجره اصلی برنامهتان ۲ ویو به نامهای خانه و کار داریم. برای مشخص کردن ویو جاری در ViewModel پنجره اصلی یک پراپرتی ایجاد میکنیم:
public class MainViewModel { public ViewModelBase CurrentView {get; set;} }سپس محتوای کنترل کانتنت پنجره اصلی را به این متغیر بایند میکنیم:
<ContentControl Content="{Binding CurrentView}" />در نهایب برای هر VM یک تمپلت ایجاد میکنیم تا بر اساس مقدار پراپرتی CurrentView که با کانتنت کنترل بایند شده، دیتاتمپلت مشخص کند که کدام ویو باید لود شود.
<DataTemplate DataType="{x:Type HomeViewModel}"> <TextBlock Text="This is the Home Page" /> </DataTemplate>
<DataTemplate DataType="{x:Type WorkViewModel}"> <localControls:WorkViewUserControl /> </DataTemplate>
استفاده از DataTrigger
گاهی ممکن است به جای یک نوع بخواهیم بر اساس مقدار یک پراپرتی ویو را عوض کنیم. در این صورت میتوانیم از دیتاتریگرها استفاده کنیم. مثلا در همان مثال بالا در صورتی که به جای اینکه CurrentView نوع ViewModel رو مشخص کند، نام آن رو ذخیره کند (مقداری رشتهای) آنگاه اینطور میتوانیم عمل کنیم:برای هر مقدار یک تمپلت تعریف میکنیم:
<DataTemplate x:Key="ViewOneTemplate" DataType="{x:Type ContentControl}">آنگاه با یک دیتا تریگر بین این دو تمپلت بر اساس مقدار پراپرتی، (در اینجا CurrentView که از نوع رشته است) سوئیچ میکنیم.
<local:View1 />
</DataTemplate>
<DataTemplate x:Key="ViewTwoTemplate" DataType="{x:Type ContentControl}">
<local:View2 />
</DataTemplate>
<ContentControl>
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Setter Property="ContentTemplate" Value="{StaticResource ViewOneTemplate}" />
<Style.Triggers>
<DataTrigger Binding="{Binding CurrentView}" Value="View2">
<Setter Property="ContentTemplate" Value="{StaticResource ViewTwoTemplate}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
منبع: وبلاگ Rachel Lim که برای یادگیری WPF و MVVM بسیار عالیست!