MVVM パターンで View のビヘイビアで処理することによってコードビハインドを書かずに済まそうという動きがある。
そうすると View の XAML と一緒に View1.cs にこんなコードが残ってしまう。
public partial class View1 : UserControl
{
public View1()
{
this.InitializeComponent();
}
}
潔くこのコードも捨ててしまおう。
XAMLは全て App.Xaml か ResourceDictionary.Xaml に書く。
ResourceDictionary が増えていってもマージすれば問題ない。
<Application x:Class="DataTemplateSample.App"
xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”
xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”
xmlns:local="clr-namespace:DataTemplateSample"
StartupUri="MainWindow.xaml">
<Application.Resources>
<DataTemplate DataType="{x:Type local:Sample1ViewModel}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="さん" />
<TextBlock Text="{Binding Age}"/>
<TextBlock Text="才" />
</StackPanel>
</DataTemplate>
<DataTemplate DataType="{x:Type local:Sample2ViewModel}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="さんの年は" />
<TextBlock Text="{Binding Age}"/>
<TextBlock Text="才です" />
</StackPanel>
</DataTemplate>
</Application.Resources>
</Application>
namespace DataTemplateSample
{
public class Sample1ViewModel : ViewModelBase
{
public string Name { get; set; }
public int Age { get; set; }
}
public class Sample2ViewModel : ViewModelBase
{
public string Name { get; set; }
public int Age { get; set; }
}
public class MainViewModel : ViewModelBase
{
public Sample1ViewModel Sample1ViewModel { get; set; }
public Sample2ViewModel Sample2ViewModel { get; set; }
public MainViewModel()
{
Sample1ViewModel = new Sample1ViewModel() { Name = "えムナウ", Age = 28 };
Sample2ViewModel = new Sample2ViewModel() { Name = "えムナウ", Age = 28 };
}
}
}
<Window x:Class="DataTemplateSample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation”
xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”
xmlns:local="clr-namespace:DataTemplateSample"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<local:MainViewModel x:Key="MainViewModel"/>
</Window.Resources>
<Grid DataContext="{StaticResource ResourceKey=MainViewModel}">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<ContentControl Content="{Binding Sample1ViewModel}"/>
<ContentControl Grid.Row="1" Content="{Binding Sample2ViewModel}"/>
</Grid>
</Window>
MainWindow.cs は残ってしまうがメインウィンドウなので何かに使うかもしれない。
こうしてどうせ使わないコードビハインドは追いだせるのである。
Visual Studio で XAML のデザインが確認できないという問題はある。
しかし Expression Blend ではリソースとして確認し普通にデザインできるのでビヘイビアも含めてデザインはBlendで行うという人には全然問題にならないのである。