SelectedValue Combobox не отражает изменения при переходе к нулевому элементу - PullRequest
1 голос
/ 08 сентября 2011

Я теряю выбранное значение при переходе от одного элемента к другому. Моя коробка со списком выглядит так:

<local:ComboBoxEx x:Name="MYCB" 
       ItemsSource="{Binding Committente}" 
       SelectedValue="{Binding CommittenteSelected, Mode=TwoWay}"
       SelectionChanged="committente_SelectionChanged"
/>

Committente происходит из ViewModel:

private ObservableCollection<CommittenteV> _Committente;
public ObservableCollection<CommittenteV> Committente
{
    get { return _Committente; }
    set
    {
        _Committente = value;
        RaisePropertyChanged("Committente");
    }
}

в конструкторе моей модели представления моя коллекция сделана так:

Committente = ObservableCollectionConverter.GetObservableCollection<CommittenteV>(Service.getList);
Committente.Insert(0, null);

И я добавляю нулевой предмет, чтобы иметь возможность иметь предмет, который символизирует «Все предметы»

Моя проблема заключается в том, что при переходе от «реальных» элементов к этому нулевому элементу CommittenteSelected не становится равным null, а вместо этого выбирается значение предыдущего элемента.

Если это не работает, как я мог бы прилично реализовать эту функцию «все элементы», чтобы кормить поле со списком моих фильтров?

Спасибо за вашу помощь,

Ответы [ 2 ]

1 голос
/ 08 сентября 2011

Вместо того, чтобы установить это значение в null, вы можете добавить статический CommittenteV к CommittenteV, который возвращает «Неуказанный / Все» экземпляр CommittenteV. Что-то похожее на:

public static CommittenteV AllCommittente = new CommittenteV { Id = SomeUniqueValue };

Затем проверьте это вместо нулевого. И когда вы добавите его в свой список:

Committente.Insert(0, CommittenteV.AllCommittente);

Может быть, дать этому "AllCommittente" уникальный идентификатор, который никогда не будет использоваться ни одним из "настоящих" комитентов? Это также позволяет вам создавать специальные метки отображения (если у вас есть свойство, которое используется для отображения значения в выпадающем списке) для этой записи AllCommittente.

0 голосов
/ 12 сентября 2011

Вы также можете создать дочерний объект вашего объекта CommittenteV, чтобы при проверке того, какой объект был выбран, вы можете использовать оператор «is».

public class AllCommittenteV : CommittenteV, IRepresentAll {}

Committente.Insert(0, new AllCommittenteV());

if (SelectedItem is typeof(AllCommittenteV))
   // Use All
else
   // Use One

Это открывает вам возможность создать класс Processor, который вы можете внедрить в свою виртуальную машину. Бросьте класс процессора в метод SelectionChanged, и вы можете изменить все поведение класса, просто изменив, какой прецессор вы добавляете.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...