WPF:带有 CheckBox 的自定义 ListBoxItem - 在 Checked 上删除文本
WPF: Custom ListBoxItem with CheckBox - Strike through text on Checked
我正在写一个简单的待办事项列表,我有一个 class TaskItem,其中包含 属性 "Completed",class 实现了 inotify属性更改了 class 和所有属性。
我想要的是能够设置 DataTrigger,因此当复选框为 checked/unchecked 时,文本被删除线。
我的列表框代码如下:
<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 来完成还是我需要设置事件并通过代码方面来完成。
您可以将触发器添加到文本块而不是整个数据模板:
<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>
希望对您有所帮助!
问题出在触发器中的绑定中。您不能在 DataTemplate 触发器中使用相对源。另一个问题是setter。您必须指定目标名称。
如何在 DataTemplate 中编写触发器有两种选择:
使用数据触发器:
<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 在这两种情况下是相同的
我正在写一个简单的待办事项列表,我有一个 class TaskItem,其中包含 属性 "Completed",class 实现了 inotify属性更改了 class 和所有属性。
我想要的是能够设置 DataTrigger,因此当复选框为 checked/unchecked 时,文本被删除线。
我的列表框代码如下:
<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 来完成还是我需要设置事件并通过代码方面来完成。
您可以将触发器添加到文本块而不是整个数据模板:
<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>
希望对您有所帮助!
问题出在触发器中的绑定中。您不能在 DataTemplate 触发器中使用相对源。另一个问题是setter。您必须指定目标名称。
如何在 DataTemplate 中编写触发器有两种选择:
使用数据触发器:
<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 在这两种情况下是相同的