我有一个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',我希望更改能够反映在我的下拉列表中,但事实并非如此。
答案 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 Programatically,How to programmatically set data binding using C# xaml。