MVVM ListBox, управляющий Контентом - PullRequest
3 голосов
/ 15 декабря 2009

Я ходил кругами с этим в течение нескольких дней, и я надеюсь, что гуру WPF может увидеть, где я иду не так.

Я устанавливаю CurrentViewModel в коде. Выбранный элемент моего ListBox и содержимое моего ContentControl связываются правильно Но при изменении выбранного элемента в списке через интерфейс пользователя CurrentViewModel устанавливается, но элемент управления контентом не обновляется.

Я использую шаблон данных для сопоставления моих видов и моделей видов.

    <DataTemplate DataType="{x:Type ViewModel:MyViewModel}">
       <View:MyView />
    </DataTemplate>

У меня есть ListBox, который привязан к наблюдаемой коллекции ViewModels. Выбранный элемент привязан к текущей модели представления.

 <ListBox ItemsSource="{Binding MyViewModelCollection}" DisplayMemberPath="DisplayName" SelectedItem="{Binding CurrentViewModel, Mode=TwoWay}"/>

У меня также есть элемент управления контентом, который также привязан к модели CurrentView

 <ContentControl Content="{Binding CurrentViewModel, Mode=TwoWay}"/>

Это свойство, с которым они оба связаны

        public MyViewModel CurrentViewModel
    {
        get
        {
            return _currentViewModel;
        }
        set
        {
            if (_currentViewModel== value) return;

            _currentViewModel= value;
            OnPropertyChanged("CurrentViewModel");
        }
    }

Я отредактировал имена для ясности и удалил информацию о форматировании.

Любая помощь с благодарностью.

Приветствия

Даниил

РЕДАКТИРОВАТЬ: наткнулся на ссылку Как отладить привязки WPF? . Я установил точку останова для привязки содержимого, и она действительно вызывается только один раз, когда привязка устанавливается впервые.

1 Ответ

4 голосов
/ 15 декабря 2009

Вы не должны устанавливать TwoWay в качестве режима на вашем ContentControl:

<ContentControl Content="{Binding CurrentViewModel, Mode=OneWay}"/>

Это потому, что вы намерены использовать ContentControl для чтения значения, но никогда записи этого.


Кроме того, вы также можете привязать ContentControl к текущему выбранному элементу в коллекции, а не к этому свойству, выполнив следующее:

<ListBox ItemsSource="{Binding MyViewModelCollection}" 
         DisplayMemberPath="DisplayName" 
         IsSynchronizedWithCurrentItem="True"/>

<ContentControl Content="{Binding MyViewModelCollection/}"/>

«Косая черта» (/) в конце коллекции указывает текущий элемент, выбранный в коллекции, и установку этого свойства элемента так же просто, как установку IsSynchronizedWithCurrentItem равной true.

Много раз я нахожу с этой комбинацией, мне действительно не нужно дополнительное свойство в моей модели представления.

В любом случае, я надеюсь, что это поможет.

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