WPF ObservableCollection: Как добавить пустую строку в поле со списком одной формы, но на самом деле не повлиять на ObservableCollection? - PullRequest
4 голосов
/ 07 октября 2010

У меня есть статическая коллекция ObservableCollection в классе репозитория данных.Я использую его для заполнения поля со списком в одной из моих форм (которая должна включать пустую строку, представляющую NULL).

Я использую ту же ObservableCollection для заполнения DataGrid, поэтому я не хочупустой элемент в фактической коллекции ObservableCollection.Как мне на самом деле это сделать?

О, и причина, по которой я хочу это сделать, заключается в том, что если у меня открыты обе формы и я удаляю элемент из ObservableCollection, это должно отражать это в обоих списках.

Ответы [ 2 ]

5 голосов
/ 07 октября 2010
  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;
1 голос
/ 07 октября 2010

Возможно, вы сможете использовать свойство TargetNullValue объявления привязки для объявления вывода для нулевого значения.

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