ListViewItem IsSelected TwoWay绑定不起作用

问题描述 投票:0回答:1

我为我的应用程序创建了一个“ DarkMode”主题,但是IsSelectedListViewItem绑定无效。当我选择一个/多个项目时,它们会按预期突出显示(即MultiTriggers使用正确的突出显示颜色),因此ListView显然认为IsSelected == True。但是永远不会调用Setter,因此我的模型中的属性永远不会更新。

[如果删除x:Key="RemoteComputerItem"样式,则可以正常工作(即,调用Setter并更新了我的模型)。删除该样式的所有触发器没有什么区别(我显然看不到突出显示的项目,但仍未调用Setter)。这样就只剩下以下内容:

<ControlTemplate TargetType="{x:Type ListViewItem}">
    <Border x:Name="Bd">
        <GridViewRowPresenter HorizontalAlignment="{TemplateBinding HorizontalAlignment}" VerticalAlignment="{TemplateBinding VerticalAlignment}" />
    </Border>
</ControlTemplate>

我相信问题出在上面的控制模板之内,但我不知道如何解决。我想念什么吗?还是我需要使用其他东西代替GridViewRowPresenter

我的XAML在下面。我没有将C#包含在内,因为我认为问题就在这里,并且不想让这个问题问得太久,但是我很乐意在需要时添加它。

视图:

<ListView x:Name="ADComputers" Margin="0" Padding="0" Grid.Row="1" Grid.Column="2" 
          ItemsSource="{Binding SelectedItem.Computers, ElementName=ADTree, Mode=TwoWay}"
          SelectionMode="Multiple" ItemContainerStyle="{DynamicResource RemoteComputerItem}">
    <ListView.Resources>
        <Style TargetType="{x:Type ListViewItem}" BasedOn="{StaticResource RemoteComputerItem}">
            <Setter Property="IsSelected" Value="{Binding IsSelected}" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding StatusText}" Value="Offline">
                    <Setter Property="Foreground" Value="Gray" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ListView.Resources>
    <ListView.View>
        <GridView>
            <GridViewColumn Header="" Width="20">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Image Source="" />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn x:Name="Name" Width="120" DisplayMemberBinding="{Binding Name}">
                <GridViewColumn.Header>
                    <GridViewColumnHeader Content="Computer Name" util:SortOrderGlyph.IsSorted="False" util:SortOrderGlyph.SortDirection="True">
                        <i:Interaction.Triggers>
                            <i:EventTrigger EventName="Click">
                                <cal:ActionMessage MethodName="SortCol">
                                    <cal:Parameter Value="Name" />
                                    <cal:Parameter Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GridViewColumnHeader}}}" />
                                </cal:ActionMessage>
                            </i:EventTrigger>
                        </i:Interaction.Triggers>
                    </GridViewColumnHeader>
                </GridViewColumn.Header>
            </GridViewColumn>

            <!-- More columns like above, removed to shorten -->

        </GridView>
    </ListView.View>
</ListView>

DarkMode主题的单独资源字典:

<Style x:Key="RemoteComputerItem" TargetType="{x:Type ListViewItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListViewItem}">
                <Border x:Name="Bd">
                    <GridViewRowPresenter HorizontalAlignment="{TemplateBinding HorizontalAlignment}" VerticalAlignment="{TemplateBinding VerticalAlignment}" />
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" TargetName="Bd">
                            <Setter.Value>
                                <SolidColorBrush Color="{DynamicResource ControlMouseOverColor}" />
                            </Setter.Value>
                        </Setter>
                    </Trigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="Selector.IsSelectionActive" Value="False" />
                            <Condition Property="IsSelected" Value="True" />
                        </MultiTrigger.Conditions>
                        <Setter Property="Background" TargetName="Bd">
                            <Setter.Value>
                                <SolidColorBrush Color="{DynamicResource SelectedBackgroundColor}" />
                            </Setter.Value>
                        </Setter>
                    </MultiTrigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="Selector.IsSelectionActive" Value="True" />
                            <Condition Property="IsSelected" Value="True" />
                        </MultiTrigger.Conditions>
                        <Setter Property="Background" TargetName="Bd">
                            <Setter.Value>
                                <SolidColorBrush Color="{DynamicResource SelectedBackgroundColor}" />
                            </Setter.Value>
                        </Setter>
                    </MultiTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
c# wpf xaml data-binding
1个回答
0
投票

尝试UpdateSourceTrigger=PropertyChanged

<Setter Property="IsSelected" Value="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged}" />

属性IsSelected必须出现在绑定到实现DataContext接口的Control的INotifyPropertyChanged的类中,通过这种方式

private _bool _isSelected
public bool IsSelected
{
    get => _isSelected;
    set
    {
        _isSelected = value;
        OnPropertyChanged(nameof(IsSelected));
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.