WPF ObservableCollection:如何在一个表单的组合框中添加空行,但实际上不影响 ObservableCollection?

发布于 2024-09-26 17:55:07 字数 257 浏览 1 评论 0原文

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

我使用相同的 ObservableCollection 来填充 DataGrid,因此我不希望实际 ObservableCollection 中存在空白项。我实际上该如何做到这一点?

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

I have a static ObservableCollection in a Data Repository class. I use it to populate a combobox on one of my forms (which needs to be able to include a blank line which represents NULL).

I use the same ObservableCollection to populate a DataGrid, so I don't want the blank item in the actual ObservableCollection. How do I actually do this?

Oh, and the reason I want to do this is so that if I have both forms open and I delete an item from the ObservableCollection it should reflect that in both of the lists.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

遮了一弯 2024-10-03 17:55:07
  1. 您不能在组合框中选择空值。
  2. 您必须使用空白项目才能将其显示在控件中。
  3. 我有同样的问题,我在当前的项目中使用这个解决方案:

    public class ObservableCollectionCopy; : ObservableCollection;
    {
    公共 ObservableCollectionCopy(T firstItem, ObservableCollection baseItems)
    {
        this.FirstItem = 第一个Item;
        this.Add(firstItem);
        foreach(baseItems 中的 var item)
            this.Add(项目);
        baseItems.CollectionChanged += BaseCollectionChanged;
    }
    
    
    公共 T FirstItem { 得到;放; }
    
    
    私有无效BaseCollectionChanged(对象发送者,NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null)
            foreach (e.NewItems.Cast().Reverse() 中的 var newItem)
                this.Insert(e.NewStartingIndex + 1, newItem);
        if (e.OldItems!= null)
            foreach (e.OldItems.Cast() 中的 var oldItem)
                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;
  1. You can't select null value in combobox.
  2. You have to use blank item to display it in the control.
  3. I have the same problem and i'm using this solution in my current project:

    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);
    }
    }
    

New collection has one-way binding to base collection:

this.SelectableGroups = new ObservableCollectionCopy<GroupModel>(
                new GroupModel{Id = -1, Title = "Any group"},
                this.GroupsCollection);

Filtering:

if (this.selectedGroup != null && this.selectedGroup.Id != -1)
    this.MyCollectionView.Filter = v => v.SomeItem.GroupId == this.selectedGroup.Id;
else this.MyCollectionView.Filter = null;
梦中的蝴蝶 2024-10-03 17:55:07

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

<ComboBox ItemsSource={Binding Path=Collection, TargetNullValue="-------"}/>

You might be able to use the TargetNullValue property of a binding declaration to declare output for a null value.

<ComboBox ItemsSource={Binding Path=Collection, TargetNullValue="-------"}/>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文