C# ListBox.SelectedItem和ListBoxItem.IsSelected不同步
我在WPF窗口中定义了一个列表框,如下所示:C# ListBox.SelectedItem和ListBoxItem.IsSelected不同步,c#,wpf,mvvm,listbox,C#,Wpf,Mvvm,Listbox,我在WPF窗口中定义了一个列表框,如下所示: <ListBox ItemsSource="{Binding Values}" SelectedItem="{Binding SelectedValue}"> <ListBox.ItemTemplate> <DataTemplate> <Border BorderThickness="1" BorderBrush="Black" Margin="5">
<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();
}
}
私有字符串selectedValue;
私有可观测收集值;
公共主窗口视图模型()
{
this.values=newobserveCollection(new[]{“Fish”、“Chips”、“Peas”});
}
公共可观测收集值
{
得到
{
返回这个值;
}
}
公共字符串SelectedValue
{
获取{返回this.selectedValue;}
设置
{
this.selectedValue=value;
如果(值=“豌豆”)
{
this.SelectedValue=null;
}
this.OnPropertyChanged();
}
}
列表框中的每个条目都显示其文本和一对文本块,指示是否设置了listboxitem的IsSelected,以及列表框的当前SelectedItem是什么
一切正常,直到选择“豌豆”选项。
视图模型有一段代码,该代码在该实例中将viewmodel的SelectedValue
设置为null,进而将listbox的SelectedItem属性设置为null(覆盖用户刚刚单击“PEA”的事实)
但是,ListBoxItem的“Peas”的IsSelected
属性没有设置为false,即使ListBoxItem现在没有选择的项
有没有建议如何强制ListBoxItem同时具有
IsSelected=false
?好的,我找到了一个解决方法,似乎可以完成这项工作。我已经把积木换了
if (value == "Peas")
{
this.SelectedValue = null;
}
与
本质上是将SelectedValue
的设置推迟到null,直到处理用户单击的代码块完成之后,从而确保它们不会相互干扰
如果没有其他人有更“优雅”的解决方案,我会将此标记为公认的答案 您是否尝试将selectedindex值设置为负值?@ShaktiPrakashSingh您的意思是什么?通过绑定到视图模型属性,我根本不涉及SelectedIndex属性,只涉及SelectedItem。那应该足够了,对吧?不,那不会帮助你实现你想做的事情。将SelectedValue设置为null并不意味着没有选择值,它意味着当前选择的值为“null”,因此SelectedItem也为null。您需要以某种方式重置组合框选择。可能您可以尝试重置源集合,但这只是一种解决方法。将values=null,然后再次还原集合values。@ShaktiPrakashSingh但将
SelectedValue
设置为null确实会导致列表框没有选择值。如果我在调用相同代码的列表框外放置一个按钮,SelectedValue=null代码>然后它工作正常。问题在于用户显式选择了该ListBoxItem,但代码随后尝试立即取消选择它。。。我怀疑这与双向绑定中的冲突有关。
if (value == "Peas")
{
Dispatcher.CurrentDispatcher.BeginInvoke((Action)(() => this.SelectedValue = null));
}