WPF里动态切换不同的模板

本文详细介绍了如何通过静态资源Style和数据触发器在窗体中实现动态设置模版的选择和应用,包括内容控件的设置、不同数据模板的实现以及解决数据模板DataContext继承问题的方法。

今天要做一个设置的窗口,可以根据不同的设置内容使用不同的设置模版,在网上找了好久,终于决定使用放在静态资源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>
最后的结果就是这样的了,效果还行吧。



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值