【问题标题】:ListBox.SelectedItem and ListBoxItem.IsSelected get out of syncListBox.SelectedItem 和 ListBoxItem.IsSelected 不同步
【发布时间】:2014-05-30 09:46:22
【问题描述】:

我在 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();
        }
    }

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

一切正常,直到选择“豌豆”选项。 视图模型有一段代码在该实例中将视图模型的SelectedValue 设置为空,这又将列表框的 SelectedItem 属性设置为空(覆盖用户刚刚单击“豌豆”的事实)。

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

任何建议如何强制 ListBoxItem 也有IsSelected=false

【问题讨论】:

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

标签: c# wpf mvvm listbox


【解决方案1】:

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

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

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

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

如果没有其他人对此有更“优雅”的解决方案,我会将其标记为已接受的答案!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2012-05-23
    • 2010-11-25
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    相关资源
    最近更新 更多