【发布时间】: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 绑定中的冲突有关。