【问题标题】:Unable to clear selection in a combobox无法清除组合框中的选择
【发布时间】:2014-06-17 14:02:59
【问题描述】:

足够简单的要求 - 尝试在用户按下“清除”按钮时重置 WPF 组合框。表单上的所有其他内容都按预期清除,但此 ComboBox 除外。

<ComboBox ItemsSource="{Binding Members}" DisplayMemberPath="MemberName" SelectedValue="{Binding RequestingMember, Mode=TwoWay}" SelectedValuePath="MemberID" IsEditable="{Binding FixedRequestingMember }"></ComboBox>

这是它绑定到的属性:

    public int RequestingMember
    {
        get { return _requestingMember; }
        set
        {
            if (_requestingMember != value)
            {
                _requestingMember = value;
            }
        }
    }

这是我用来清除盒子的东西:

this.RequestingMember = -1;

值得一提的是,Members 集合中没有任何内容对应于 -1 键。无论如何,当您按清除时,该值不会从其选择中改变。

我尝试将 int 设置为 0 并在 XAML 中设置 UpdateSourceTrigger=PropertyChanged,但无济于事。我不愿意将RequestingMemeber 更改为int? 的类型,因为它需要在很长一段时间内级联到应用程序的其他部分的修复。

我做错了什么?

【问题讨论】:

  • 为什么要绑定索引?为什么不绑定到SelectedItem?这样,当您想清除它时,您可以将其清空。处理索引更复杂,不会给您带来任何好处:/
  • 您使用“-1”这一事实让我觉得您将SelectedValueSelectedIndex 混淆了。如果组合框是可编辑的,它可以是 any 字符串,而不仅仅是下拉列表中的值;即你应该绑定到Text

标签: c# wpf xaml mvvm combobox


【解决方案1】:

请阅读 MSDN 上的 Use SelectedValue, SelectedValuePath, and SelectedItem 页面以获取有关此内容的完整信息,但简而言之,通过将数据绑定到 SelectedItem 属性,而不是使用 SelectedValueSelectedValuePath 属性,您会更幸运.尝试将与集合中的项目和数据绑定相同类型的属性添加到 SelectedItem 属性:

public Member SelectedMember // Implement the INotifyPropertyChanged Interface here!!
{
    get { return selectedMember; }
    set
    {
        if (selectedMember != value)
        {
            selectedMember = value;
            NotifyPropertyChanged("SelectedMember");
        }
    }
}

您还需要使用属性在您的类中实现INotifyPropertyChanged Interface。您的 XAML 现在应该如下所示:

<ComboBox ItemsSource="{Binding Members}" DisplayMemberPath="MemberName" 
    SelectedItem="{Binding SelectedMember, Mode=TwoWay}" 
    IsEditable="{Binding FixedRequestingMember }" />

现在您需要做的就是清除选择:

SelectedMember = null;

【讨论】:

  • 谢谢。这最初不是我的代码,写它的人离开了 :) 它使用索引的原因是因为该值在此表单的其他地方用作 FK - 即它作为数字记录在数据库中。所以我必须做一些重构来处理这个问题。仅供参考 - 所有基类都已经有 INotifyPropertyChanged。
  • 所有基类都已经有 INotifyPropertyChanged...你没有在 RequestingMember 属性中显示它。无论哪种方式,您仍然可以使用SelectedValueSelectedValuePath 属性以及SelectedItem 属性。
  • 不,它是继承的——但我很抱歉没有说清楚。感谢您提供有用的答案。
猜你喜欢
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 2021-04-11
  • 1970-01-01
相关资源
最近更新 更多