将 ComboBox 绑定到 ObservableCollection

问题描述 投票:0回答:1

我有一个 WPF C# 应用程序。

我正在使用 ComboBox,并且已将其 ItemSource 属性设置为 ObservableCollection。

我遇到的问题是,当我修改此集合时,更改不会反映在我的下拉列表中。

所以我想知道我做错了什么?

这是我的班级对象:

public class JobTicker
{
    public string CustomerRef { get; set; }
    public string JobRef { get; set; }
    public int JobId { get; set; }
    public string CustomerJobDetails { get; set; }
    public string CustomerName { get; set; }
}

我绑定到我的收藏:

ActiveState.JobsActive = new ObservableCollection<JobTicker>('data from a list');

我的集合变量声明:

public static ObservableCollection<JobTicker> JobsActive = new ObservableCollection<JobTicker>();

我的组合框(位于我的用户控件上,在我的应用程序启动时加载)

<xctk:WatermarkComboBox  x:Name="cboActiveJobs" Grid.Row="1" Grid.Column="2" 
    Width="250" Watermark="Select Customer"          
    DisplayMemberPath="CustomerJobDetails" 
    HorizontalContentAlignment="Center"                     
    SelectionChanged="cbo_SelectionChanged" 
    DropDownOpened="cbo_DropDownOpened" 
    DropDownClosed="cbo_DropDownClosed"
    Style="{StaticResource ComboBoxFlatStyle}"
    />

以及我背后的代码:

cboActiveJobs.ItemsSource = ActiveState.JobsActive;

现在,如果我修改“ActiveState.JobsActive”,我希望更改会反映在我的组合框中,但事实并非如此。

c# wpf combobox observablecollection
1个回答
4
投票

您拥有的代码实际上并未绑定它。它只是将一个集合分配给一个属性。

组合框的

ItemsSource
属性无法侦听来自
ObservableCollection
的通知。相反,您需要
Binding
类的实例来侦听这些通知并进行 UI 更新。
Binding
就是所有魔力所在。您可以在代码隐藏中以编程方式创建一个并将其附加(请参阅下面的链接),但最简单且迄今为止最常见的方法是在 XAML 中绑定:

<xctk:WatermarkComboBox  

    ItemsSource="{Binding JobsActive}"

    SelectedItem="{Binding SelectedCustomer}"

    x:Name="cboActiveJobs" 
    Grid.Row="1" 
    Grid.Column="2" 
    Width="250" 
    Watermark="Select Customer"          
    DisplayMemberPath="CustomerJobDetails" 
    HorizontalContentAlignment="Center"                     
    SelectionChanged="cbo_SelectionChanged" 
    DropDownOpened="cbo_DropDownOpened" 
    DropDownClosed="cbo_DropDownClosed"
    Style="{StaticResource ComboBoxFlatStyle}"
    />

现在,

JobsActive
应该是该控件的
DataContext
的视图模型的公共属性。如果不是,那就行不通。

既然你有一个 SelectionChanged 事件,我还添加了一个

SelectedCustomer
绑定,它也将是你的视图模型上的一个属性。
Binding
将以两种方式更新:在视图模型中更改它,组合框选择将会更改。当用户选择组合框项时,视图模型的属性值将发生变化。

private JobTicker _selectedCustomer;
public JobTicker SelectedCustomer {
    get { return _selectedCustomer; }
    set {
        _selectedCustomer = value;
        //  If you're not in C#6, use this instead:
        //OnPropertyChanged("SelectedCustomer");
        OnPropertyChanged(nameof(SelectedCustomer));
    }
}

//  Implement INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propName)
{
    var handler = PropertyChanged;
    if (handler != null)
    {
        handler(this, new PropertyChangedEventArgs(propName));
    }
}

如果您确实希望在不编写视图模型的情况下立即使此绑定工作,我不推荐这种方法,但它绝对可行。 StackOverflow 上有几个答案应该有助于实现该功能:WPF Binding Programatically(以编程方式绑定)、How to以编程方式使用 C# xaml 设置数据绑定

© www.soinside.com 2019 - 2024. All rights reserved.