【问题标题】:Binding ComboBox with collection of integers将 ComboBox 与整数集合绑定
【发布时间】:2020-05-19 11:42:00
【问题描述】:

完全相同的代码适用于字符串集合,但它会因整数而失败。

我的代码(删除了不必要的部分以使事情清晰):

XAML:

        <ComboBox Name="Id" 
                  Grid.Row="5"
                  SelectedItem="{Binding Id}" 
                  ItemsSource="{Binding Ids}" 
                  Style="{StaticResource MaterialDesignComboBox}"
                  IsEnabled="True"
                  IsEditable="False"
                  IsReadOnly="True"/>

视图模型:

    class ViewModel : BaseViewModel, INotifyPropertyChanged
    {
        public ObservableCollection<int> Ids { get; set; }

        new public event PropertyChangedEventHandler PropertyChanged;
    }
    public class BaseViewModel : INotifyPropertyChanged
    {
        public int Id { get; set; }

        public event PropertyChangedEventHandler PropertyChanged;
    }

(代码和名称已调整以代表问题,同时忽略了不必要的信息)

列表已填充,我可以选择其中一个选项,但选择的选项是空白的。用户无法分辨已选择的内容。任何建议这里有什么问题?

编辑

将每个整数解析为字符串(并将集合更改为字符串)解决了这个问题。我不知道,看来 ComboBox 不喜欢整数。

【问题讨论】:

  • 请发布您的 ViewModel 的完整类定义,包括您尝试绑定的 Id 属性
  • 您的Id 属性在哪里以及如何定义?
  • 啊,我忘了显示基本视图模型。 ID 已定义。
  • 您只需要实现一次 INotifyPropertyChanged - 在您的 BaseViewModel 类中,而不是在每个 ViewModel 类中
  • 另外,您的属性设置器不会触发 PropertyChanged 事件。

标签: c# wpf combobox


【解决方案1】:

我认为这里的问题是,您的 ComboBox 具有名称“Id”并且您想绑定到具有相同名称的属性。如果您不使用 ComboBox 的名称,我建议您将其删除。否则你可以重命名它。

编辑:当然,您的视图模型必须包含“Id”-属性:

public class ViewModel : INotifyPropertyChanged
{
    public ObservableCollection<int> Ids { get; set; }
    public int Id { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;
}

【讨论】:

  • 删除名称没有任何改变。结果是一样的。
【解决方案2】:

即使您删除了一些其他代码,您也可以在“class ViewModel”的同一命名空间中创建一个具有 int 类型 ID 属性的新类,并将该类用作 ObservableCollection 的类型。然后在您的 ComboBox 中,将 SelectedValuePath 设置为 ID 并将 SelectedValue 绑定回 BaseViewModel 类中的 Id 属性。

最后,您应该能够删除“class ViewModel”中对 INotifyPropertyChanged 的​​引用,因为在使用 BaseViewModel 作为基类时应该会自动继承它。

这样的……

C#

public class ViewModel : BaseViewModel
{
     public ObservableCollection<ComboBoxIDClass> Ids { get; set; }
}

public class ComboBoxIDClass : INotifyPropertyChanged
{
     public int ID { get; set; }

     public event PropertyChangedEventHandler PropertyChanged;
}

XAML

<ComboBox Name="Id" Grid.Row="5" ItemsSource="{Binding Ids}" SelectedValuePath="ID" SelectedValue="{Binding Id}" Style="{StaticResource MaterialDesignComboBox}" IsEnabled="True" IsEditable="False" IsReadOnly="True"/>

【讨论】:

    【解决方案3】:

    尝试将绑定模式更改为双向:

    <ComboBox Name="Id" 
                  Grid.Row="5"
                  SelectedItem="{Binding Id, Mode=TwoWay}" 
                  ItemsSource="{Binding Ids}" 
                  Style="{StaticResource MaterialDesignComboBox}"
                  IsEnabled="True"
                  IsEditable="False"
                  IsReadOnly="True"/>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      相关资源
      最近更新 更多