我在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
的任何建议吗?
答案 0 :(得分:0)
好的,我找到了一个似乎可以完成工作的解决方法。我已经取代了块
if (value == "Peas")
{
this.SelectedValue = null;
}
与
if (value == "Peas")
{
Dispatcher.CurrentDispatcher.BeginInvoke((Action)(() => this.SelectedValue = null));
}
基本上将SelectedValue
的设置推迟到null,直到处理完用户点击的代码块完成为止,从而确保它们不会相互干扰。
如果没有其他人有更优雅的话,我会将此标记为已接受的答案。解决这个问题!