2013-01-20 27 views
2

在我的应用程序中,我有一个CheckBox其中,我想当它被检查,显示一个DataTemplate,当它未选中时,显示另一个。如何在运行时更改数据模板?

下面是两个模板

<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在我的用户控制火灾或只是确定何时改变。

+0

查找'DataTemplateSelector',我认为它应该很好地适合你的需要。 –

+0

好吧,那不是我真正的疑问,我的意思是,当复选框状态发生变化时,我希望那些无形的消息,我看到fireth数据模板选择器 –

+0

。那么,一种选择是创建一个派生自'ContentControl'的类,其中包含三个依赖项属性:两个用于模板的DataTemplate类型和一个用于绑定到CheckBox.IsChecked的'bool'。然后,此控件可以根据Boolean属性的值设置适当的模板,并且还可以在依赖项属性更改时更新模板。然后,您可以立即将此类放置在RowHeaderTemplate的'DataTemplate'中,并添加适当的绑定。 –

回答

0

你只能通过触发器来做到这一点。如果上述事情是你的要求。你可以简单地通过触发器来完成。我试过了,它为我工作。

<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> 

试试这个。