绑定更改时防止列表框自动选择第一项
Posted
技术标签:
【中文标题】绑定更改时防止列表框自动选择第一项【英文标题】:Prevent list box automatically selecting first item when binding changes 【发布时间】:2014-05-23 05:35:52 【问题描述】:我有这样的设置:
ViewModel sn-p:
private ObservableCollection<Field> _Fields;
public ObservableCollection<Field> Fields
get
return _Fields;
set
NotifyPropertyChanged(ref _Fields, value, "Fields");
private Field _SelectedField;
public Field SelectedField
get
return _SelectedField;
set
NotifyPropertyChanged(ref _SelectedField, value, "SelectedField");
XAML:
<ListBox x:Name="FieldList" ItemsSource="Binding Fields" SelectedValue="Binding SelectedField">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="Binding Name" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我非常频繁地更新字段集合,如下所示:
List<Field> myFieldList = myDataSource.GetFields();
Fields = new ObservableCollection<Field>(myFieldList);
当我这样做时,列表框会自动默认选择第一项。我希望它默认不选择任何内容(例如SelectedIndex = -1
或SelectedValue = null
)。我怎样才能做到这一点?
【问题讨论】:
我试图重现它,但没有成功。我有一个ListBox
和一个 ItemsSource
绑定。它没有选择我的第一个项目。你确定它不在你的代码中吗?
我认为这并不重要,但也许确实如此......我编辑了我的问题,因为我还将列表框的 SelectedValue 绑定到我的 VM 上的一个属性。 没有代码设置此值,我很肯定这是某种默认的 WPF 行为。
【参考方案1】:
我试过了,但无法重现。 如果您的 VM 中已经有 SelectedField,请尝试在更新字段后将其设置为 null。
您也可以尝试使用操作/触发器将 SelectedIndex 设置为 -1 像这样
<ListBox x:Name="FieldList" ItemsSource="Binding Fields" SelectedValue="Binding SelectedField">
<i:Interaction.Triggers>
<ei:PropertyChangedTrigger Binding="Binding Fields">
<ei:ChangePropertyAction TargetObject="Binding ElementName=FieldList" PropertyName="SelectedIndex" Value="-1"/>
</ei:PropertyChangedTrigger>
</i:Interaction.Triggers>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="Binding Name" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
但实际上这并不是重置选择的最佳方式。
【讨论】:
就是这样,我只需在刷新数据时将SelectedField
设置为null
。我猜它一定与所选值被绑定的事实有关。【参考方案2】:
绑定或加载列表后,设置
listbox1.SelectedIndex=-1;
【讨论】:
以上是关于绑定更改时防止列表框自动选择第一项的主要内容,如果未能解决你的问题,请参考以下文章