将组合框绑定到ObservableCollection

时间:2016-03-29 18:31:47

标签: c# wpf combobox observablecollection

我有一个wpf c#应用程序。

我正在使用一个组合框,我已将其itemsource属性设置为一个可观察的集合。

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

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

这是我的类对象:

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',我希望更改能够反映在我的下拉列表中,但事实并非如此。

1 个答案:

答案 0 :(得分: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 ProgramaticallyHow to programmatically set data binding using C# xaml