代码之家  ›  专栏  ›  技术社区  ›  Chris Thomas

WPF:带有复选框的自定义ListBoxItem-选中时删除文本

  •  1
  • Chris Thomas  · 技术社区  · 10 年前

    我正在编写一个简单的待办事项列表,我有一个包含属性“Completed”的类TaskItem,该类实现了在类和所有属性上更改的inotifyproperty。

    我所追求的是能够设置一个DataTrigger,因此当选中/取消选中复选框时,文本将被删除。

    我的列表框代码如下:

                <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来实现,还是需要设置事件并通过代码端实现。

    2 回复  |  直到 10 年前
        1
  •  1
  •   Liero    10 年前

    问题在于触发器中的绑定。不能在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>
    

    两种情况下的setter都相同

        2
  •  0
  •   Nikita Shrivastava    10 年前

    您可以将触发器添加到文本块,而不是整个数据模板:

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

    希望它有帮助!