【问题标题】:How to bind ComboBox to ObservableCollection property?如何将 ComboBox 绑定到 ObservableCollection 属性?
【发布时间】:2016-09-25 01:11:00
【问题描述】:

我想将 ObservableCollections 的字符串属性绑定到 ComboBox。

型号

class Sequence : INotifyPropertyChanged
{
    public Sequence() { }

    private int _id;
    public int ID
    {
        get
        {
            return _id;
        }
        set
        {
            _id = value;
            OnPropertyChanged("ID");
        }
    }
    private string _name;
    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            _name = value;
            OnPropertyChanged("Name");
        }
    }

public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

视图模型:

private ObservableCollection<Sequence> _storedSequences = new ObservableCollection<Sequence>() { };
    public ObservableCollection<Sequence> StoredSequences { get { return _storedSequences; } }

查看 XAML:

<ComboBox x:Name="sequencesComboBox" SelectedIndex="0" ItemsSource="{Binding StoredSequences}" DisplayMemberPath="{Binding Name}" >

问题是 ComboBox 不显示字符串属性。见下图(NQR_GUI_WPF为命名空间):

谁能告诉我我做错了什么?

【问题讨论】:

    标签: c# wpf xaml binding combobox


    【解决方案1】:

    您需要指定项目的DataTemplate

    <ComboBox x:Name="sequencesComboBox" SelectedIndex="0" ItemsSource="{Binding StoredSequences}">
       <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}"/>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
    

    【讨论】:

      【解决方案2】:

      除非你想要一些特殊的模板,否则你不需要在你的ComboBox 上设置ItemTemplate。你已经绑定到你的ItemSource,所以要设置显示成员路径,你只需给它属性的字符串名称:

      <ComboBox x:Name="sequencesComboBox" 
                SelectedIndex="0" 
                ItemsSource="{Binding StoredSequences}"
                DisplayMemberPath="Name" >
      

      如果你说这有点尴尬,我不会不同意。

      【讨论】:

        【解决方案3】:

        您不需要在 DisplayMemberName 中进行绑定。从 DisplayMemberPath 中删除绑定

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-18
          • 2011-04-17
          • 2015-03-14
          • 1970-01-01
          • 2014-05-25
          相关资源
          最近更新 更多