Изменение контекста данных для шаблона данных очищает выбор поля со списком - PullRequest
2 голосов
/ 22 марта 2012

У меня есть TreeView, который позволяет пользователю выбирать различные элементы.Отображение для каждого элемента определяется с помощью шаблонов данных с DataType, установленным на соответствующий тип ViewModel.DataContext автоматически устанавливается на основе выбранного элемента в древовидном представлении для соответствующего ViewModel.

Вот проблема:

Один из шаблонов данных имеет ComboBox, связанный сObservableCollection для получения списка элементов и свойство для получения / установки SelectedValue в ViewModel.

Когда я выбираю один элемент этого типа, а затем выбираю другой элемент того же типа, ComboBox отображает пустойвместо правильно выбранного элемента.Похоже, что поле со списком устанавливает свойство SelectedValue равным NULL сразу после перехода к новому элементу, а затем никогда не обновляется.

<ComboBox Margin="1,0" 
    ItemsSource="{Binding ItemsToSelect}" 
    SelectedValue="{Binding SelectedValue}" 
    SelectedValuePath="ValuePath" DisplayMemberPath="DisplayPath"
    IsEnabled="{Binding CanSelectItem}">
</ComboBox>

Действительно странная часть, если я выбираюэлемент другого типа при выборе элементов одного типа, он всегда отображается правильно.

Я пытался игнорировать значение NULL в установщике SelectedValue, но это не сработалонезависимо от того, вызывал ли я также событие PropertyChanged или нет.

private MyObject selectedValue;
public MyObject SelectedValue
{
    get
    {
        return selectedValue;
    }
    set
    {
        if (value != null)
        {
            this.selectedValue = value;
        }
        this.OnPropertyChanged("SelectedValue");
    }
}

Глядя на подобные вопросы во время написания этого, я получаю интересный атрибут, который я еще не нашел - IsSynchronizedWithCurrentItem из этого вопрос .Сначала я подумал, что это решило проблему, но, увы, он просто несколько меняет поведение.

Если для этого атрибута установлено значение True, комбо не полностью отменяет свой выбор,но вместо этого просто помечает первый элемент как выбранный.Таким образом, вместо того, чтобы быть установленным в NULL , теперь свойство SelectedValue устанавливается для первого элемента в списке.

У кого-нибудь есть идеи для решения?

Ответы [ 2 ]

1 голос
/ 23 марта 2012

Я разобрался, но это не совсем , что я хотел.

Я изменил привязку, чтобы использовать SelectedItem вместо SelectedValue, и проблема не возникает.

Я получил идею из этого вопроса .

Итак, я изменился

SelectedValue="{Binding SelectedValue}" 

Кому (и переименовать мое свойство ViewModel):

SelectedItem="{Binding SelectedItem}"

После обновления использования этого свойства во ViewModel все заработало.

1 голос
/ 23 марта 2012

Если я правильно понимаю вашу проблему, здесь происходит несколько вещей.

Сначала у вас не установлено Mode=TwoWay, UpdateSourceTrigger=PropertyChanged} в ваших привязках.

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

Проверьте это Привязка данных

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