2011-03-04 24 views
5

我有一個錯誤對話框(如下簡化顯示)。如何使用複選框動態更改WPF控件的模板?

我顯示給我所限定的模板simpleErrorTemplateContentControl中報告對象。

上有,我想用的模板更改爲/從detailedErrorTemplate窗口中的複選框。達到此目的的最佳方法是什麼?

<Window x:Class="Core.ErrorDialog" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Window.Resources> 

     <ControlTemplate x:Key="simpleErrorTemplate"> 
      <TextBox Margin="10,10,10,5" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Text="{Binding Message}" /> 
     </ControlTemplate> 

     <ControlTemplate x:Key="detailedErrorTemplate"> 
      <TextBox Margin="10,10,10,5" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Text="{Binding Message}" /> 
      <TextBox Margin="10,10,10,5" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Text="{Binding Details}" /> 
      <TextBox Margin="10,10,10,5" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Text="{Binding StackTrace}" /> 
     </ControlTemplate> 

    </Window.Resources> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*" />   
      <RowDefinition Height="50" /> 
     </Grid.RowDefinitions> 

     <ContentControl Grid.Row="0" Template="{StaticResource simpleErrorTemplate}" DataContext="{Binding Report}"/> 

     <CheckBox Margin="10,0,0,0" Grid.Row="1" x:Name="ChkShowDetails">Show Details</CheckBox>    
    </Grid> 
</Window> 

回答

9

您可以使用DataTrigger在ContentControl風格,你綁定到ChkShowDetails的IsChecked財產CheckBox

<ContentControl Grid.Row="0" DataContext="{Binding Report}"> 
    <ContentControl.Style> 
     <Style TargetType="ContentControl"> 
      <Setter Property="Template" 
        Value="{StaticResource simpleErrorTemplate}"/> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding ElementName=ChkShowDetails, 
               Path=IsChecked}" 
          Value="True"> 
        <Setter Property="Template" 
          Value="{StaticResource detailedErrorTemplate}"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ContentControl.Style> 
</ContentControl> 

更新

完整的XAML示例,貼吧和嘗試:)

<Window.Resources> 
    <ControlTemplate x:Key="simpleErrorTemplate"> 
     <TextBox Margin="10,10,10,5" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Text="T1" /> 
    </ControlTemplate> 
    <ControlTemplate x:Key="detailedErrorTemplate"> 
     <StackPanel> 
      <TextBox Margin="10,10,10,5" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Text="T2" /> 
      <TextBox Margin="10,10,10,5" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Text="T3" /> 
      <TextBox Margin="10,10,10,5" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Text="T4" /> 
     </StackPanel> 
    </ControlTemplate> 
</Window.Resources> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="50" /> 
    </Grid.RowDefinitions> 
    <ContentControl Grid.Row="0" DataContext="{Binding Report}"> 
     <ContentControl.Style> 
      <Style TargetType="ContentControl"> 
       <Setter Property="Template" 
         Value="{StaticResource simpleErrorTemplate}"/> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding ElementName=ChkShowDetails, 
                Path=IsChecked}" 
           Value="True"> 
         <Setter Property="Template" 
           Value="{StaticResource detailedErrorTemplate}"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ContentControl.Style> 
    </ContentControl> 
    <CheckBox Margin="10,0,0,0" Grid.Row="1" x:Name="ChkShowDetails">Show Details</CheckBox> 
</Grid> 
+0

謝謝,我考慮了一個嘗試,雖然它似乎沒有工作,作風不更新 – chillitom 2011-03-04 10:17:59

+1

@chillitom:難道您將模板從ContentControl移動到樣式中的Setter? – 2011-03-04 10:20:27

+0

@chillitom:更新了我的答案。你應該能夠複製/粘貼,並將其與你的代碼進行比較,看看你丟失了什麼 – 2011-03-04 10:24:57

1

此解決方案適用於正在搜索模板交換的用戶。 這很簡單,希望它可以幫助你。請指出任何錯誤。

只需使用此代碼更改複選框Checked事件上的模板。

private void checkBox1_Checked(object sender, RoutedEventArgs e) 
    { 
     DataTemplate Temp; 
     Temp = (DataTemplate)this.FindResource("TemplateYouHaveCreated"); 
     listView1.ItemTemplate = Temp; 
    } 

參考有關更多信息,這個鏈接

http://developingfor.net/2009/01/09/dynamically-switch-wpf-datatemplate/

+0

還有TryFindResource,如果資源不存在而不是拋出錯誤。 – Hugoagogo 2016-02-18 23:24:59