2014-08-21 6 views
1

Этот вопрос был дан ответ несколько раз, но я не могу представить решение вместе. То, что у меня есть, - это то, что я склеиваю на разных форумах. Я также новичок в 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? Что-то еще не так с этим кодом? Благодарю.

ответ

0

Источником привязки должна быть ваша модель просмотра, а не DataTemplate. Значение DataTemplate с определением DataType в XAML автоматически привяжет контент к шаблону данных, который соответствует типу.

Таким образом, вы могли бы создать общий интерфейс/базовый класс для просмотра моделей 1 & 2:

public interface IViewModel { } 
public class ViewModel1 : IViewModel { } 
public class ViewModel2 : IViewModel { } 

private IViewModel _viewModel1 = new ViewModel1(); 
private IViewModel _viewModel2 = new ViewModel2(); 

private IViewModel _CurrentPageViewModel; 
public IViewModel CurrentPageViewModel 
{ 
    get { return _CurrentPageViewModel; } 
    set { Set(() => CurrentPageViewModel, ref _CurrentPageViewModel, value); } 
} 
+0

Я также нуждаются в уточнении это заявление -> DATATYPE = "{х: Тип ViewModel: ViewModel2}" Означает ли это установить контекст данных для этого шаблона данных в ViewModel2 или мне нужно переключить контекст в коде? – KrisW

+0

@ KrisW ну, он не устанавливает контекст данных как таковой. Он сообщает компилятору XAML привязать объекты типа ViewModel2 к этому шаблону данных. Итак, когда вы установите элемент управления контентом в экземпляр ViewModel2, будет применен «ReportGridDataTemplate», у него будет контекст данных этого экземпляра модели представления. – McGarnagle

+1

В качестве альтернативы использованию интерфейсов здесь я предпочитаю использовать «BaseViewModel» и реализовывать в нем интерфейс «INotifyPropertyChanged», чтобы другие модели просмотра не нуждались. Таким образом, мое свойство больше похоже на это (но они будут работать одинаково): 'public BaseViewModel ViewModel {get; задавать; } '. (Это был просто комментарий для автора вопроса) – Sheridan

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