【问题标题】:Silverlight - rebinding to a property?Silverlight - 重新绑定到属性?
【发布时间】:2011-02-15 10:20:09
【问题描述】:
我刚刚开始使用 Silverlight。
基本上,我有一个 silverlight 用户控件,它具有各种 dataGrids 和一个组合框,它们的项目源设置为自定义纯 c# 对象的属性。
我的问题是我有一个下拉列表,当用户从列表中选择一个项目时,一个新行应该出现在其中一个网格中。
我所做的只是处理 SelectionChanged 事件并将新项目添加到我的自定义对象的列表中,并再次为网格设置 itemsource。这似乎不起作用;没有行被添加到 dataGrid
我不知道如何强制我的网格“重新绑定”到这个属性。
我一直在阅读依赖属性,这些是我需要的吗?
任何指针将不胜感激。
【问题讨论】:
标签:
silverlight
binding
dependency-properties
【解决方案1】:
您要绑定的列表应该是 ObservableCollection 类型。然后数据网格应该自动显示新项目。
【解决方案2】:
问题在于,当您将相同的列表分配给ItemsSource 时,DataGrid 知道它的相同列表,因此它什么也不做。
正如 Henrik 指出的,对于要绑定到多项控件的 ItemsSource 属性的属性(例如 DataGrid、ListBox 等),您应该公开 Observable<T> 而不是 List<T>。
此外,如果您希望代码对这些属性所做的更改自动显示在 UI 中,您的“普通 c# 对象”应实现 INotifyPropertyChanged 接口。
【解决方案3】:
您可能想要做的是更新绑定源 - 这相对容易完成。
private void ComboBox_SelectionChanged(object sender, RoutedEventArgs e)
{
this.dataGrid.GetBindingExpression(DataGrid.ItemsSource).UpdateSource();
}
这是一个小技巧,但会做你需要做的事情。实现INotifyPropertyChanged 是另一个很好的建议。
Silverlight show 在INotifyPropertyChanged here 上有一些很棒的信息