列表框.SelectedItem和ListBoxItem.IsSelected不同步

本文关键字:IsSelected 同步 ListBoxItem SelectedItem 列表 | 更新日期: 2023-09-27 18:06:06

我在WPF窗口中定义了一个列表框:

<ListBox ItemsSource="{Binding Values}" SelectedItem="{Binding SelectedValue}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Border BorderThickness="1" BorderBrush="Black" Margin="5">
                <StackPanel Margin="5">
                    <TextBlock FontWeight="Bold" Text="{Binding}"/>
                    <StackPanel Orientation="Horizontal">
                        <Label>Is Selected: </Label>
                        <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=IsSelected}"/>
                    </StackPanel>
                    <StackPanel Orientation="Horizontal">
                        <Label>Selected Item:</Label>
                        <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=ListBox}, Path=SelectedItem}"/>
                    </StackPanel>
                </StackPanel>
            </Border>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

在视图模型上:

    private string selectedValue;
    private ObservableCollection<string> values;
    public MainWindowViewModel()
    {
        this.values = new ObservableCollection<string>(new[] { "Fish", "Chips", "Peas" });
    }
    public ObservableCollection<string> Values
    {
        get
        {
            return this.values;
        }
    }
    public string SelectedValue
    {
        get { return this.selectedValue; }
        set
        {
            this.selectedValue = value;
            if (value == "Peas")
            {
                this.SelectedValue = null;
            }
            this.OnPropertyChanged();
        }
    }

列表框中的每个条目都显示其文本和一对文本块,该文本块指示listboxitem的IsSelected是否已设置,以及列表框的当前SelectedItem是什么。

一切正常,直到"Peas"选项被选中。视图模型有一段代码,在该实例中将视图模型的SelectedValue设置为null,从而将列表框的SelectedItem属性设置为null(覆盖用户刚刚单击"Peas"的事实)。

然而,ListBoxItem的IsSelected属性"豌豆"不会被设置为false,即使ListBox现在没有选择的项目。

任何建议如何强迫ListBoxItem有IsSelected=false,以及?

列表框.SelectedItem和ListBoxItem.IsSelected不同步

好的,我已经找到了一个解决方法,似乎可以完成这项工作。我已经替换了

if (value == "Peas")
{
    this.SelectedValue = null;
}

if (value == "Peas")
{
    Dispatcher.CurrentDispatcher.BeginInvoke((Action)(() => this.SelectedValue = null));
}

本质上延迟SelectedValue的设置为null,直到处理用户单击的代码块完成之后,从而确保它们不会相互干扰。

如果没有人有更"优雅"的解决方案,我将把这个标记为可接受的答案!