绑定更改时防止列表框自动选择第一项

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 = -1SelectedValue = 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;

【讨论】:

以上是关于绑定更改时防止列表框自动选择第一项的主要内容,如果未能解决你的问题,请参考以下文章

易语言选择列表框

WPF:仅当列表框中的一项被选中时才启用按钮

如何防止 C# WinForm 列表视图选择更改时按下键和列表视图根据第一列自动查找下一行

绑定数据更改时Winforms列表框不更新

在基于非绑定列重新查询后访问 VBA 还原列表框选择

更改 nana 列表框中的值