簡體   English   中英

WPF:帶有CheckBox的自定義ListBoxItem-刪除選中的文本

[英]WPF: Custom ListBoxItem with CheckBox - Strike through text on Checked

我正在編寫一個簡單的待辦事項列表,我有一個TaskItem類,其中包含屬性“ Completed”,該類實現了在該類和所有屬性上更改的inotifypropertychanged。

我需要的是能夠設置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進行操作還是需要設置事件並通過代碼的方式進行操作?

問題出在觸發器中。 您不能在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>

兩種情況下的設置器都相同

您可以將觸發器添加到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>

希望能幫助到你!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM