列表框.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
,以及?
好的,我已经找到了一个解决方法,似乎可以完成这项工作。我已经替换了
if (value == "Peas")
{
this.SelectedValue = null;
}
if (value == "Peas")
{
Dispatcher.CurrentDispatcher.BeginInvoke((Action)(() => this.SelectedValue = null));
}
本质上延迟SelectedValue
的设置为null,直到处理用户单击的代码块完成之后,从而确保它们不会相互干扰。
如果没有人有更"优雅"的解决方案,我将把这个标记为可接受的答案!