2012-07-02 28 views
4

我想根據特定的布爾值更改我的WPF應用程序中的對象的DataTemplate。當值爲「True」時,我想讓DataTemplate成爲某些東西,當值爲「False」時,我想讓DataTemplate成爲其他東西。使用DataTriggers在運行時更改DataTemplates

我試過編寫這段代碼,但到目前爲止,我最終會遇到一個惱人的「內存異常」。

<DataTemplate DataType="{x:Type vm:MyObjectViewModel}"> 
    <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding Visible}" Value="False"> 
      <Setter TargetName="MainTemplateGrid" Property="Content"> 
       <Setter.Value> 
        <Ellipse Width="50" Height="50" Fill="Red" /> 
       </Setter.Value> 
      </Setter> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding Visible}" Value="True"> 
      <Setter TargetName="MainTemplateGrid" Property="Content"> 
       <Setter.Value> 
        <Image Source="{Binding Icon}" Opacity="{Binding Visible, Converter={StaticResource VisibilityConverter}}" /> 
       </Setter.Value> 
      </Setter> 
     </DataTrigger> 
    </DataTemplate.Triggers> 
    <ContentControl x:Name="MainTemplateGrid" /> 
</DataTemplate> 

如果任何人有關於如何解決這個問題的線索,請讓我知道。

+0

你應該首先聲明ContentControl中,然後DataTriggers。有時這對解決名稱引用很重要。 – LPL

回答

2

我想通了。

我該使用ContentControl,通過使用DataTrigger S設定其Style做,下面的代碼:

<DataTemplate DataType="{x:Type vm:MyControlViewModel}"> 
    <ContentControl> 
     <ContentControl.ToolTip> 
      <!-- TOOLTIP CODE GOES HERE --> 
     </ContentControl.ToolTip> 
     <ContentControl.InputBindings> 
      <!-- INPUT BINDINGS CODE GOES HERE --> 
     </ContentControl.InputBindings> 
     <ContentControl.ContextMenu> 
      <!-- CONTEXT MENU CODE GOES HERE --> 
     </ContentControl.ContextMenu> 
     <ContentControl.Style> 
      <Style> 
       <Style.Triggers> 
        <DataTrigger Binding="Visibility" Value="0"> 
         <Setter Property="ContentControl.Content"> 
          <Setter.Value> 
           <Ellipse Width="50" Height="50" Opacity="0.5"> 
            <Ellipse.Fill> 
             <LinearGradientBrush> 
              <GradientStopCollection> 
               <GradientStop Color="Red" Offset="0" /> 
               <GradientStop Color="DarkRed" Offset="0.8" /> 
              </GradientStopCollection> 
             </LinearGradientBrush> 
            </Ellipse.Fill> 
           </Ellipse> 
          </Setter.Value> 
         </Setter> 
        </DataTrigger> 
        <DataTrigger Binding="Visibility" Value="100"> 
         <Setter Property="ContentControl.Content"> 
          <Setter.Value> 
           <Image Source="{Binding Icon}" Opacity="{Binding Visible, Converter={StaticResource VisibilityConverter}}" /> 
          </Setter.Value> 
         </Setter> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ContentControl.Style> 
    </ContentControl> 
</DataTemplate>