我在数据存储库类中有一个静态 ObservableCollection。我用它在我的一个表单上填充一个组合框(它需要能够包含一个代表 NULL 的空行)。
我使用相同的 ObservableCollection 来填充 DataGrid,所以我不希望在实际的 ObservableCollection 中出现空白项。我该怎么做?
哦,我想这样做的原因是,如果我打开了两个表单并从 ObservableCollection 中删除了一个项目,它应该在两个列表中都反映出来。
我在数据存储库类中有一个静态 ObservableCollection。我用它在我的一个表单上填充一个组合框(它需要能够包含一个代表 NULL 的空行)。
我使用相同的 ObservableCollection 来填充 DataGrid,所以我不希望在实际的 ObservableCollection 中出现空白项。我该怎么做?
哦,我想这样做的原因是,如果我打开了两个表单并从 ObservableCollection 中删除了一个项目,它应该在两个列表中都反映出来。
我有同样的问题,我在我当前的项目中使用这个解决方案:
public class ObservableCollectionCopy<T> : ObservableCollection<T>
{
public ObservableCollectionCopy(T firstItem, ObservableCollection<T> baseItems)
{
this.FirstItem = firstItem;
this.Add(firstItem);
foreach (var item in baseItems)
this.Add(item);
baseItems.CollectionChanged += BaseCollectionChanged;
}
public T FirstItem { get; set; }
private void BaseCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.NewItems != null)
foreach (var newItem in e.NewItems.Cast<T>().Reverse())
this.Insert(e.NewStartingIndex + 1, newItem);
if (e.OldItems != null)
foreach (var oldItem in e.OldItems.Cast<T>())
this.Remove(oldItem);
}
}
新集合与基本集合具有单向绑定:
this.SelectableGroups = new ObservableCollectionCopy<GroupModel>(
new GroupModel{Id = -1, Title = "Any group"},
this.GroupsCollection);
过滤:
if (this.selectedGroup != null && this.selectedGroup.Id != -1)
this.MyCollectionView.Filter = v => v.SomeItem.GroupId == this.selectedGroup.Id;
else this.MyCollectionView.Filter = null;
您也许可以使用TargetNullValue
绑定声明的属性来声明空值的输出。
<ComboBox ItemsSource={Binding Path=Collection, TargetNullValue="-------"}/>