2012-03-11 4 views
0

Я пытаюсь переключить содержимое элемента управления содержимым с помощью ICommands. Теперь настройка этого свойства работает в конструкторе, но не в любой из команд.Связывание ContentControl с DataTemplate работает только в конструкторе?

У меня есть это в моей app.xaml

<Application.Resources> 
    <vm:ViewModelLocator x:Key="Locator" 
         d:IsDataSource="True" /> 
    <DataTemplate DataType="{x:Type vm:HomeViewModel}"> 
     <views:HomeView /> 
    </DataTemplate> 
    <DataTemplate DataType="{x:Type vm:DeviceViewModel}"> 
     <views:DeviceView /> 
    </DataTemplate> 
</Application.Resources> 

Это фрагмент из ShellView.xaml (Какой вид, который содержит элемент управления содержимым Я желаю изменить):

<ContentControl Content="{Binding Path=CurrentViewModel}" /> 

Другой фрагмент здесь показывает кнопку привязки:

<Button Content="Button" 
       Height="23" 
       Name="button2" 
       Width="75" 
       Command="{Binding Path=DeviceViewCommand}" /> 

Вот конструктор из ShellView Модель. Как я уже сказал, здесь работает CurrentViewModel. (Вы заметите, что я установил устройство, а затем домой как тест.)

public ShellViewModel() 
    { 
     CurrentViewModel = ShellViewModel._deviceViewModel; 
     CurrentViewModel = ShellViewModel._homeViewModel; 
     HomeViewCommand = new RelayCommand(() => ExecuteHomeViewCommand()); 
     DeviceViewCommand = new RelayCommand(() => ExecuteDeviceViewCommand()); 
     LogOut = new RelayCommand(() => LogOutExecute(),() => true); 

    } 

    private void ExecuteDeviceViewCommand() 
    { 
     CurrentViewModel = ShellViewModel._deviceViewModel; 

    } 

Я делаю что-то неправильно здесь?

Это свойство также изменилось для модели текущего вида. Должен добавить это раньше.

public ViewModelBase CurrentViewModel 
    { 
     get 
     { 
      return _currentViewModel; 
     } 
     set 
     { 
      if (_currentViewModel == value) 
       return; 
      _currentViewModel = value; 
      RaisePropertyChanged("CurrentViewModel"); 
     } 
    } 
+0

Похоже, вы используете MVVM, но я мог ошибаться, но я просто хотел сказать, что еще не добрался до этого. Однако мне любопытно, является ли CurrentViewModel зависимым свойством или запускает PropertyChanged? – Silvermind

+0

Да, я бы пометил его, но это не похоже на конкретную проблему MVVM. Я добавил код PropertyChanged выше. – benjgorman

+0

Код здесь выглядит правильно. Установили ли вы контрольную точку в ExecuteDeviceViewCommand, чтобы убедиться, что вызов вызывается нажатием кнопки2? –

ответ

0

Так что я должен был решить это, разбив шаблон MVVM. Я использовал класс светлых мессенджеров MVVM в коде моей модели представления оболочки, чтобы просто установить элемент управления содержимым в новое представление, а затем установить его контекст данных в текущую модель представления ShellViewModel.

Я не совсем доволен этим решением, но он работает правильно.

1

Если я правильно понял ваш probled, вы можете создать класс VM для CurrentViewModel, наследуют его от INotifyPropertyChanged и изменять `S свойство. Bindng Должен быть в одну сторону.

+0

Вот что я сделал. Однако свойство, похоже, не меняется. – benjgorman

+0

Является ли ваше событие PropertyChanged нулевым, когда вы пытаетесь его поднять? – dvvrd

+0

Значение не изменяется в соответствии с тем, что задает команда. Представление просто не меняется, чтобы отразить это. Я предполагаю, что существует проблема с привязкой к управлению содержимым. – benjgorman

1

Я хотел бы сделать шаг назад и дать ContentControl имя и попытаться установить свойство содержимого напрямую, чтобы увидеть, что-то еще не так. Кроме того, как DataContext установлен для ContentControl? Попытайтесь установить точки останова на сеттерах. Вы также можете проверить окно вывода на наличие ошибок в Bindings.

Смежные вопросы