2011-03-04 14 views
5

Ho una finestra di dialogo di errore (mostrato di seguito semplificato).Come modificare dinamicamente il modello di un controllo WPF utilizzando una casella di controllo?

ho visualizzare il report oggetto in un ContentControl a cui ho definito un modello di simpleErrorTemplate.

C'è un CheckBox sulla finestra che vorrei utilizzare per cambiare il modello da/per detailedErrorTemplate. Qual è il modo migliore per raggiungere questo obiettivo?

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

risposta

9

È possibile utilizzare un DataTrigger in stile ContentControl in cui si legano al IsChecked proprietà dei ChkShowDetails 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> 

Aggiornamento

Complete esempio XAML, incollarlo e provarlo :)

<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

grazie, ho dato a questo una prova e anche se non sembra funzionare, lo stile non viene aggiornato – chillitom

+1

@chillitom: Did si sposta il modello dal ContentControl alla Setter in stile? –

+0

@chillitom: Aggiornato la mia risposta. Si dovrebbe solo essere in grado di copiare/incollare che e confrontarlo con il codice per vedere cosa vi state perdendo –

1

Questa soluzione è per coloro che cercano lo scambio di modelli. È semplice speranza che ti aiuti. Si prega di segnalare eventuali errori.

basta usare questo codice per cambiare il modello di casella di controllo Controllato evento.

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

riferiscono questo link per maggiori informazioni

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

+0

C'è anche TryFindResource che restituirà null se la risorsa non esiste invece di generare un errore. – Hugoagogo

Problemi correlati