今天要做一个设置的窗口,可以根据不同的设置内容使用不同的设置模版,在网上找了好久,终于决定使用放在静态资源Style中的数据触发器,简单记录一下。
首先,放了一个内容控件
<Border BorderBrush="Silver" Name="border1">
<ContentControl Name="contentControl" Style="{StaticResource SettingSelectorStyle}"
/>
</Border>
接着把内容控件的Style以数据触发器的形式实现,数据触发器根据SelectedSettingIndex选择触发使用不同的数据模板
<Style x:Key="SettingSelectorStyle" TargetType="{x:Type ContentControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=SelectedSettingIndex}" Value="0">
<Setter Property="ContentTemplate" Value="{StaticResource SamplingSettingTemplate}"/>
</DataTrigger>
...
</Style.Triggers>
</Style>
再下一步就是实现各个不同的数据模板啦,举一个作为例子
<DataTemplate x:Key="SamplingSettingTemplate">
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Name="grid1">
...
</Grid>
</DataTemplate>
这样,就可以根据DataContext中的SelectedSettingIndex属性切换不同的布局了,我在程序中使用了一个列表控件的SelectedIndex来进行切换
<ListView Name="lstSetting" ItemsSource="{Binding Path=listSettingString}"
SelectedIndex="{Binding Path= SelectedSettingIndex, Mode=TwoWay}"
/>
接下来又碰到了个不大不小的问题,我在资源里面绑定了不少内容,但都显示不到。用Snoop看了一下,发现数据模板的DataContext没有继承上级的DataContext,没办法,只好自己手动绑定了
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Name="grid1"
DataContext="{Binding Path=DataContext, RelativeSource={RelativeSource AncestorType={x:Type ContentControl}}}"
>
...
</Grid>
最后的结果就是这样的了,效果还行吧。