4

我在数据存储库类中有一个静态 ObservableCollection。我用它在我的一个表单上填充一个组合框(它需要能够包含一个代表 NULL 的空行)。

我使用相同的 ObservableCollection 来填充 DataGrid,所以我不希望在实际的 ObservableCollection 中出现空白项。我该怎么做?

哦,我想这样做的原因是,如果我打开了两个表单并从 ObservableCollection 中删除了一个项目,它应该在两个列表中都反映出来。

4

2 回答 2

5
  1. 您不能在组合框中选择空值。
  2. 您必须使用空白项在控件中显示它。
  3. 我有同样的问题,我在我当前的项目中使用这个解决方案:

    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;
于 2010-10-07T07:47:17.050 回答
1

您也许可以使用TargetNullValue绑定声明的属性来声明空值的输出。

<ComboBox ItemsSource={Binding Path=Collection, TargetNullValue="-------"}/>
于 2010-10-07T06:51:53.380 回答