2011-03-04 4 views
5

오류 대화 상자가 있습니다 (아래 그림 참조). 확인란을 사용하여 동적으로 WPF 컨트롤의 템플릿을 변경하는 방법은 무엇입니까?

나는 어떤 나는 템플릿 simpleErrorTemplate을 정의하는 ContentControl을에서 보고서 객체를 표시합니다.

내가/에서 detailedErrorTemplate에 템플릿을 변경하는 데 사용할하고자하는 창에 CheckBox의 있습니다. 이것을 달성하는 가장 좋은 방법은 무엇입니까?

<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

당신은 당신이 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 예에 결합하는 경우, ContentControl 스타일에 DataTrigger를 사용하여 붙여 넣기를 시도 할 수 있습니다 :)

<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

+1

@chillitom 업데이트되지 않습니다나요 템플릿을 ContentControl에서 스타일의 Setter로 이동합니까? –

+0

@chillitom : 내 대답이 업데이트되었습니다. 그 코드를 복사하여 붙여 넣기하고 코드와 비교하여 누락 된 부분을 확인하십시오 –

1

이 솔루션은 템플릿 스왑을 검색하는 사람들을위한 솔루션입니다. 그것은 당신을 돕는 간단한 희망입니다. 실수를 지적하십시오.

이 코드는 checkBox 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

의심되는 내용으로 – Hugoagogo

관련 문제