让 DataTemplates 为您完成工作。
给定一个简单的窗口,具有以下 ViewModel:
public sealed class ViewModel : INotifyPropertyChanged
{
private object _derper;
public event PropertyChangedEventHandler PropertyChanged = (o, e) => { };
public object Derper
{
get { return this._derper; }
set
{
this._derper = value;
PropertyChanged(this, new PropertyChangedEventArgs("Derper"));
}
}
public ICommand OnDerp { get; set; }
public ViewModel()
{
OnDerp = new DerpCommand(this);
}
}
我们希望为属性 Derper 的不同值显示不同的 UI。该属性由 DerpCommand 设置:
public sealed class DerpCommand : ICommand
{
public event EventHandler CanExecuteChanged;
private readonly ViewModel _viewModel;
private int _count = 0;
public bool CanExecute(object parameter)
{
return true;
}
public void Execute(object parameter)
{
_viewModel.Derper = _count % 2 == 0 ?
(object)new Derp()
{ Herp = "Derped " + (++_count / 2 + 1) + " times." } :
new Herp()
{ Derp = "Herped " + (_count++ / 2 + 1) + " times." };
}
public DerpCommand(ViewModel viewModel)
{
this._viewModel = viewModel;
}
}
它只是根据运行次数ViewModel.Derper
在实例Herp
和类型之间切换值。Derp
我将省略这些模型的实现,因为它们是具有单个属性的 POCO。无聊的东西。
现在,当ViewModel.Derper
属性类型为 时Derp
,我们想要一个漂亮的矢车菊蓝色背景,黑色文本前景显示模型的值。当它是 typeHerp
时,我们需要黑色背景和白色文本。所以我们DataTemplates
为每个创建:
<DataTemplate
DataType="{x:Type t:Derp}">
<TextBlock
Padding="50"
Background="CornflowerBlue"
Text="{Binding Herp}" />
</DataTemplate>
<DataTemplate
DataType="{x:Type t:Herp}">
<TextBlock
Padding="50"
Foreground="White"
Background="Black"
Text="{Binding Derp}" />
</DataTemplate>
请注意,在每个DataTemplate
中DataContext
都是指定模型的实例DataType
。
我们如何连接这些?我们没有。我们只需在 UI 中DataTemplate
通过添加 a并将其属性ContentControl
绑定到. 这是整个用户界面:Content
ViewModel.Derper
<Window
x:Class="DataTemplateExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:t="clr-namespace:DataTemplateExample"
Title="DataTemplate example"
Height="350"
Width="525">
<Window.DataContext>
<t:ViewModel />
</Window.DataContext>
<Window.Resources>
<DataTemplate
DataType="{x:Type t:Derp}">
<TextBlock
Padding="50"
Background="CornflowerBlue"
Text="{Binding Herp}" />
</DataTemplate>
<DataTemplate
DataType="{x:Type t:Herp}">
<TextBlock
Padding="50"
Foreground="White"
Background="Black"
Text="{Binding Derp}" />
</DataTemplate>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition
Height="auto" />
</Grid.RowDefinitions>
<ContentControl
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="{Binding Derper}" />
<Button
Grid.Row="1"
Command="{Binding OnDerp}">Click me to derp</Button>
</Grid>
</Window>
它是什么样子的:
毕竟,如果您仍然想使用 Unity 来连接 UI,您可以创建自己的DataTemplateSelector
使用 Unity 查找模板。浪费时间恕我直言。顺其自然。