Этот вопрос был дан ответ несколько раз, но я не могу представить решение вместе. То, что у меня есть, - это то, что я склеиваю на разных форумах. Я также новичок в WPF. Я пытаюсь переключить содержимое MainWindow.xaml на некоторые параметры. Что у меня есть:Изменение типа содержимого Вопросы
<Window.Resources>
<DataTemplate x:Key="LogsGriDataTemplate" DataType="{x:Type viewModel:ViewModel1}">
<Label>This is a log</Label>
</DataTemplate>
<DataTemplate x:Key="ReportsGridDataTemplate" DataType="{x:Type viewModel:ViewModel2}">
<Label>This is a report</Label>
</DataTemplate>
</Window.Resources>
<ContentControl Grid.Row="1" Grid.Column="0" Content="{Binding CurrentPageViewModel}" />
private ViewModel1 _viewModel1 = new ViewModel1();
private ViewModel2 _viewModel2 = new ViewModel2();
private DataTemplate _CurrentPageViewModel;
public DataTemplate CurrentPageViewModel
{
get { return _CurrentPageViewModel; }
set { Set(() => CurrentPageViewModel, ref _CurrentPageViewModel, value); }
}
public void OnButtonPressMethod(object param)
{
if (view == 0)
{
CurrentPageViewModel = _viewModel1;
}
else
{
CurrentPageViewModel = _viewModel1;
}
}
Компилятор жалуется на CurrentPageViewModel = _viewModel1 2 заявления/говорят, что вы не можете установить тип ViewModel к типу DataTemplate, который имеет смысл. Каким должно быть свойство CurrentPageViewModel? Что-то еще не так с этим кодом? Благодарю.
Я также нуждаются в уточнении это заявление -> DATATYPE = "{х: Тип ViewModel: ViewModel2}" Означает ли это установить контекст данных для этого шаблона данных в ViewModel2 или мне нужно переключить контекст в коде? – KrisW
@ KrisW ну, он не устанавливает контекст данных как таковой. Он сообщает компилятору XAML привязать объекты типа ViewModel2 к этому шаблону данных. Итак, когда вы установите элемент управления контентом в экземпляр ViewModel2, будет применен «ReportGridDataTemplate», у него будет контекст данных этого экземпляра модели представления. – McGarnagle
В качестве альтернативы использованию интерфейсов здесь я предпочитаю использовать «BaseViewModel» и реализовывать в нем интерфейс «INotifyPropertyChanged», чтобы другие модели просмотра не нуждались. Таким образом, мое свойство больше похоже на это (но они будут работать одинаково): 'public BaseViewModel ViewModel {get; задавать; } '. (Это был просто комментарий для автора вопроса) – Sheridan