【问题标题】:How to change the data template in runtime?如何在运行时更改数据模板?
【发布时间】:2013-01-04 00:13:27
【问题描述】:

在我的应用程序中,我有一个CheckBox,我希望在选中时显示一个DataTemplate,在未选中时显示另一个。

这是带有两个模板的 sn-p

    <DataGrid x:Name="dataGrid" LoadingRow="dataGrid_LoadingRow_1" ItemsSource="{Binding Item3}"
        <DataGrid.RowHeaderTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding StudentId}"/>
            </DataTemplate>                
            <DataTemplate>
                <TextBlock Text="{Binding FullName}"/>
            </DataTemplate>
        </DataGrid.RowHeaderTemplate>
    </DataGrid>

我不确定如何实现它,但我认为我需要用户控件中的接口INotifyPropertyChanged 来触发或确定何时更改。

【问题讨论】:

  • 查找DataTemplateSelector,我认为它应该很好地满足您的需求。
  • 好吧,这不是我真正的疑问,我的意思是,我希望复选框状态发生变化时,触发数据模板选择器
  • 我明白了。好吧,一种选择是创建一个派生自ContentControl 的类,具有三个依赖属性:两个DataTemplate 类型用于模板,一个bool 绑定到CheckBox.IsChecked。然后,此控件可以根据Boolean-property 的值设置适当的模板,并在依赖属性更改时更新模板。然后将此类的一个实例放入 RowHeaderTemplateDataTemplate 并添加适当的绑定。

标签: c# wpf xaml datagrid datatemplate


【解决方案1】:

你只能通过触发器来做到这一点。如果以上是你的要求。您可以通过触发器简单地做到这一点。我试过了,它对我有用。

   <Window.Resources>
    <ControlTemplate x:Key="MyRowHeaderTemplate">
        <TextBlock x:Name="RowHeaderTxt" 
                   Text="{Binding StudentId, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
        <ControlTemplate.Triggers>
            <DataTrigger Binding="{Binding Path=IsChecked, ElementName=MyCheckBox}" 
                         Value="True">
                <Setter TargetName="RowHeaderTxt" Property="Text" 
                        Value="{Binding FullName, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
            </DataTrigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
</Window.Resources>
<StackPanel>
    <CheckBox x:Name="MyCheckBox"/>
    <DataGrid ItemsSource="{Binding Item3}" AutoGenerateColumns="True">
        <DataGrid.RowHeaderTemplate>
            <DataTemplate>
                <ContentControl Template="{StaticResource MyRowHeaderTemplate}"/>
            </DataTemplate>
        </DataGrid.RowHeaderTemplate>
    </DataGrid>
</StackPanel>

试试这个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多