ListBox.SelectedItem和ListBoxItem.IsSelected不同步

时间:2014-05-30 09:46:23

标签: c# wpf mvvm listbox

我在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”的事实)。

但是,即使ListBox现在没有选定的项目,ListBoxItem的“Peas”的IsSelected属性也不会设置为false。

有关如何强制ListBoxItem同时拥有IsSelected=false的任何建议吗?

1 个答案:

答案 0 :(得分:0)

好的,我找到了一个似乎可以完成工作的解决方法。我已经取代了块

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

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

基本上将SelectedValue的设置推迟到null,直到处理完用户点击的代码块完成为止,从而确保它们不会相互干扰。

如果没有其他人有更优雅的话,我会将此标记为已接受的答案。解决这个问题!