C# ListBox.SelectedItem和ListBoxItem.IsSelected不同步

C# ListBox.SelectedItem和ListBoxItem.IsSelected不同步,c#,wpf,mvvm,listbox,C#,Wpf,Mvvm,Listbox,我在WPF窗口中定义了一个列表框,如下所示: <ListBox ItemsSource="{Binding Values}" SelectedItem="{Binding SelectedValue}"> <ListBox.ItemTemplate> <DataTemplate> <Border BorderThickness="1" BorderBrush="Black" Margin="5">

我在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();
        }
    }
私有字符串selectedValue;
私有可观测收集值;
公共主窗口视图模型()
{
this.values=newobserveCollection(new[]{“Fish”、“Chips”、“Peas”});
}
公共可观测收集值
{
得到
{
返回这个值;
}
}
公共字符串SelectedValue
{
获取{返回this.selectedValue;}
设置
{
this.selectedValue=value;
如果(值=“豌豆”)
{
this.SelectedValue=null;
}
this.OnPropertyChanged();
}
}
列表框中的每个条目都显示其文本和一对文本块,指示是否设置了listboxitem的IsSelected,以及列表框的当前SelectedItem是什么

一切正常,直到选择“豌豆”选项。 视图模型有一段代码,该代码在该实例中将viewmodel的
SelectedValue
设置为null,进而将listbox的SelectedItem属性设置为null(覆盖用户刚刚单击“PEA”的事实)

但是,ListBoxItem的“Peas”的
IsSelected
属性没有设置为false,即使ListBoxItem现在没有选择的项


有没有建议如何强制ListBoxItem同时具有
IsSelected=false

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

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

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


如果没有其他人有更“优雅”的解决方案,我会将此标记为公认的答案

您是否尝试将selectedindex值设置为负值?@ShaktiPrakashSingh您的意思是什么?通过绑定到视图模型属性,我根本不涉及SelectedIndex属性,只涉及SelectedItem。那应该足够了,对吧?不,那不会帮助你实现你想做的事情。将SelectedValue设置为null并不意味着没有选择值,它意味着当前选择的值为“null”,因此SelectedItem也为null。您需要以某种方式重置组合框选择。可能您可以尝试重置源集合,但这只是一种解决方法。将values=null,然后再次还原集合values。@ShaktiPrakashSingh但将
SelectedValue
设置为null确实会导致列表框没有选择值。如果我在调用相同代码的列表框外放置一个按钮,
SelectedValue=null然后它工作正常。问题在于用户显式选择了该ListBoxItem,但代码随后尝试立即取消选择它。。。我怀疑这与双向绑定中的冲突有关。
if (value == "Peas")
{
    Dispatcher.CurrentDispatcher.BeginInvoke((Action)(() => this.SelectedValue = null));
}