2012-07-02 1 views
4

Я пытаюсь изменить DataTemplate для объектов в моем приложении WPF в соответствии с конкретным логическим значением. Когда значение «True», я хочу, чтобы DataTemplate был чем-то, а когда значение «False», я хочу, чтобы DataTemplate был чем-то другим.Изменение DataTemplates во время выполнения с использованием DataTriggers

Я пробовал написать этот код, но до сих пор я заканчиваю раздражающим «исключением из памяти».

<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 и установив его Style используя DataTrigger с, вот код:

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

Вы должны использовать селектор шаблонов данных (см. DataTemplateSelector и Data Templating Overview) и применить его к соответствующему свойству выбора шаблона (например, у кнопки есть свойство ContentTemplateSelector).