我有一个 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”,我希望更改会反映在我的组合框中,但事实并非如此。
您拥有的代码实际上并未绑定它。它只是将一个集合分配给一个属性。
组合框的
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 设置数据绑定。