Привязка ContentControl из DataTemplate работает только в конструкторе? - PullRequest
0 голосов
/ 12 марта 2012

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

У меня есть это в моем 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}" />

Вот конструктор из ShellViewModel. Как я уже сказал, установка 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");
        }
    }

Ответы [ 3 ]

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

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

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

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

0 голосов
/ 13 марта 2012

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

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

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