Вот моя проблема: мне нужно создать DataGrid с динамическими выпадающими списками, используя WPF. Если значение поля со списком уже используется в предыдущих строках, следующие, которые будут добавлены пользователем, не должны содержать уже использованный элемент.

На этом изображении ЭЛЕМЕНТ A не должен появляться в поле со списком второй строки.

У меня нет идей, как это сделать, может ли кто-нибудь показать мне свет?

OBS: DataGrid ItemsSource привязан к ObservableCollection, а DataGridComboBoxColumn ItemsSource является списком.

Благодарность !!!

0
dbiagi 27 Мар 2014 в 00:06
Я бы просто имел свойство IsSelected и отфильтровал список IsSelected = false
 – 
paparazzo
27 Мар 2014 в 00:52
@Blam, я не знаю, сработает ли это в моем случае. Я не упоминаю об этом в своем вопросе, но на самом деле я хочу скрыть или показать элементы на основе целочисленного поля в объектах в списке, если значение int равно 'x', это значение не должно отображаться в поле со списком для следующего x строк. Думаю, в этом случае лучше подойдет предложение slugster. Большое спасибо за ответ.
 – 
dbiagi
28 Мар 2014 в 16:02
В вопросе вы указываете, что он не должен появляться, если он уже использовался.
 – 
paparazzo
28 Мар 2014 в 17:09

1 ответ

Лучший ответ

ItemsSource комбо не обязательно должен быть привязан к ObservableCollection, но он может помочь в зависимости от того, как именно вы это решите.

Когда эта ячейка переходит в режим редактирования, свойство, к которому привязан ItemsSource, получает попадание - так что вы можете возвращать новый список элементов каждый раз, когда попадает в геттер. Вот очень простой пример, чтобы дать вам представление:

public List<string> MyItemsSource
{
    get 
    {
        var myNewList = MyMasterList.ToList(); //create a (reference) copy of the master list (the items are not copied though, they remain the same in both lists)
        if (PropertyA != null)
            myNewList.Remove(PropertyA);

        return myNewList;
    }
}

Итак, то, что вы создаете и возвращаете, является отфильтрованной версией вашего главного списка всех возможных элементов. LINQ будет вам здесь очень полезен.

В качестве альтернативы вы можете сохранить только одну статическую копию главного списка как ObservableCollection и просто удалять элементы из этой статической копии по мере их выбора (и добавлять их обратно, когда они не выбраны). Какой вариант вы выберете, будет зависеть от того, сколько раз список может быть изменен из-за выбранных элементов и насколько сложно создать список. В прошлом я много раз использовал динамически сгенерированный список, в большинстве случаев этот вариант работает хорошо.

0
slugster 27 Мар 2014 в 00:29
Я постараюсь решить свою проблему на основе вашего ответа и сообщу, сработало ли это. Спасибо за ответ.
 – 
dbiagi
28 Мар 2014 в 15:48