我正在尝试学习如何将视图与其关联的视图模型分开,同时使视图尽可能少或没有代码隐藏。
我的控件在对象处于显示模式时具有文本块,而在用户想要编辑该字段时具有文本框。在这两种情况下,这些控件必须绑定到模型视图中的相同字符串,但是根据视图模型的状态,只应显示相应的字符串。以前,我只是将面板子项修改为代码隐藏中的一个新元素......但据我所知,我应该尝试在XAML中为视图进行所有更改。
我的viewmodel有一个bool表示它是处于显示还是编辑模式。有没有办法根据bool的值指定使用不同的模板,但是将它全部保存在XAML中?
答案 0 :(得分:3)
通过使用DataTriggers,有一种方法可以完成您所说的工作。
首先,定义一个包含您要使用的Style
的{{1}}。例如,请注意DataTrigger
两个相同的样式,每个样式都有一个ContentControl
对,与另一个相反:
DataTrigger
然后,在您的主视觉树中,您将定义使用这些<Window.Resources>
<Style TargetType="{x:Type ContentControl}" x:Key="HiddenWhenFalse" >
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Value="False" Binding="{Binding MyBooleanValue}">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
<DataTrigger Value="True" Binding="{Binding MyBooleanValue}">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
<Style TargetType="{x:Type ContentControl}" x:Key="HiddenWhenTrue" >
<Setter Property="Visibility" Value="Visible"/>
<Style.Triggers>
<DataTrigger Value="True" Binding="{Binding MyBooleanValue}">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
<DataTrigger Value="False" Binding="{Binding MyBooleanValue}">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
的{{1}},并分配ContentControl
或Style
的{{1}}或者ViewModel的任何内容。像这样:
DataContext
这是我正在使用的ViewModel,请注意INotifyPropertyChanged的实现:
Window
现在,为了本示例的目的,我只需连接两个按钮来设置ViewModel值。如果你想使用命令连接按钮,这是一个完全不同的主题。值得讨论,但为了简单起见:
UserControl
请记住,此示例显式地为<Grid>
<StackPanel >
<Button Content="False" Name="Button2"></Button>
<Button Content="True" Name="Button1"></Button>
<ContentControl Style="{StaticResource HiddenWhenFalse}">
<ContentControl.Content>
<TextBlock Text="ITS ALL TRUE"/>
</ContentControl.Content>
</ContentControl>
<ContentControl Style="{StaticResource HiddenWhenTrue}">
<ContentControl.Content>
<TextBlock Text="ITS ALL FALSE"/>
</ContentControl.Content>
</ContentControl>
</StackPanel>
</Grid>
设置样式,如果您使用的是非该类型的类型,则必须更改样式的TargetType。