2015-09-23 6 views
0

Я пишу простой список дел, у меня есть класс TaskItem, который содержит свойство «Completed», класс реализует inotifypropertychanged для класса и всех свойств.WPF: Пользовательский ListBoxItem с CheckBox - Ударить текст по проверенному

То, что я получаю после этого, может установить DataTrigger, поэтому, когда флажок установлен/снят флажок, текст ударяется по экрану.

мой ListBox код ниже:

  <ListBox x:Name="TaskListBox" Background="#FF515658" Cursor="Arrow"> 
       <ListBox.ItemContainerStyle> 
        <Style TargetType="ListBoxItem"> 
         <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
         <Setter Property="Focusable" Value="False"/> 
        </Style> 
       </ListBox.ItemContainerStyle> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <Grid> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="Auto"/> 
            <ColumnDefinition Width="*"/> 
            <ColumnDefinition Width="Auto"/> 
           </Grid.ColumnDefinitions> 
           <CheckBox Name="CheckBoxZone" Tag="{Binding ID}" IsChecked="{Binding Completed}" Margin="0 0 0 0" Grid.Column="0"/> 
           <TextBlock x:Name="TaskNameLabel" Text="{Binding Name}" Foreground="White" Margin="10 -1 0 0" Grid.Column="1"/> 
           <Image x:Name="DelTaskButtom" Margin="8 -1 10 0" Height="10px" Width="10px" Source="../Resources/Delete.png" Cursor="Hand" Grid.Column="2" Visibility="Hidden" PreviewMouseLeftButtonDown="TaskListBoxItem_DeleteTask"/> 
         </Grid> 
          <DataTemplate.Triggers> 
           <DataTrigger Binding="{Binding IsMouseOver,RelativeSource={RelativeSource TemplatedParent}}" Value="True"> 
            <Setter Property="Visibility" TargetName="DelTaskButtom" Value="Visible" /> 
           </DataTrigger> 


          <DataTrigger Binding="{Binding IsChecked,RelativeSource={RelativeSource AncestorType={x:Type CheckBox}}}" Value="True"> 
            <Setter Property="TextBlock.TextDecorations" Value="Strikethrough" /> 
          </DataTrigger> 
         </DataTemplate.Triggers> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 

Может кто-нибудь помочь мне с этим? я могу сделать это через XAML или мне нужно установить события и сделать это через кодовую сторону вещей.

ответ

0

Проблема заключается в привязке к вашему триггеру. Вы не можете использовать относительный источник в триггере DataTemplate. Другая проблема - это сеттер. Вы должны указать TargetName.

Есть два варианта, как написать триггер в DataTemplate:

Использование DataTrigger:

<DataTrigger Binding="{Binding Completed}" Value="True"> 
    <Setter TargetName="TaskNameLabel" Property="TextDecorations" Value="Strikethrough" /> 
</DataTrigger> 

или с помощью триггера

<Trigger SourceName="CheckBoxZone" Property="IsChecked" Value="True">  
    <Setter TargetName="TaskNameLabel" Property="TextDecorations" Value="Strikethrough" /> 
</Trigger> 

сеттер одинакова в обоих случаях

+0

Это тоже трюк! большое спасибо! :-) –

0

вы можете добавить триггер TextBlock вместо шаблона всего данных:

<TextBlock.Style> 
    <Style TargetType="TextBlock"> 
     <Style.Triggers> 
     <!-- Here is how we bind to another control's property --> 
     <DataTrigger Binding="{Binding IsChecked, ElementName=CheckBoxZone}" Value="True"> 
     <Setter Property="TextBlock.TextDecorations" Value="Strikethrough" /> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    </TextBlock.Style> 

Надеется, что это помогает!

+0

Spot on !! Большое спасибо! :-) –

+0

рад помочь :) –

+0

На самом деле, это своего рода обходной путь, как определить триггер за пределами DataTemplate или ControlTemplate, но это решение не подходит в этом случае. Триггер правильно поместился в DataTemplate в исходном коде, но был плохо написан. См. Мой ответ, как исправить это. – Liero