2016-01-29 4 views
2

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

Я хочу перейти и показать представление из главного окна, но мой код не работает.

Без элементов <Window.Resources> ~ </Window.Resources> Элементы ContentControl отображают текст «MyProject.ViewModel.AuthViewModel».

, но если я поставил <Window.Resources> часть, NullReferenceException: Object reference not set to an instance of an object. at MyProject.Helper.DelegateCommand.CanExecute(Object parameter) ошибка

Что не так?

MainViewModel.cs

public class MainViewModel : ViewModelBase 
{ 
    private ICommand _changeViewCommand; 
    private ViewModelBase _currentViewModel; 
    private List<ViewModelBase> _viewModels; 

    public MainViewModel(){ 
     ViewModels.Add(new AuthViewModel()); 
     CurrentViewModel = ViewModels[0]; 
    } 

    #region Commands 
    public ICommand ChangeViewCommand 
    { 
     get 
     { 
      if (_changeViewCommand == null) 
      { 
       _changeViewCommand = new DelegateCommand(
        param => ChangeViewModel((ViewModelBase)param), 
        param => param is ViewModelBase 
       ); 
      } 
      return _changeViewCommand; 
     } 
    } 
    #endregion 

    #region Properties 
    public List<ViewModelBase> ViewModels 
    { 
     get 
     { 
      if (_viewModels == null) 
       _viewModels = new List<ViewModelBase>(); 

      return _viewModels; 
     } 
    } 

    public ViewModelBase CurrentViewModel 
    { 
     get 
     { 
      return _currentViewModel; 
     } 
     set 
     { 
      if(_currentViewModel != value) 
      { 
       _currentViewModel = value; 
       RaisePropertyChanged("CurrentViewModel"); 
      } 
     } 
    } 
    #endregion 

    private void ChangeViewModel(ViewModelBase _viewModel) 
    { 
     if (_viewModel != null && !ViewModels.Contains(_viewModel)) 
      ViewModels.Add(_viewModel); 

     CurrentViewModel = ViewModels.FirstOrDefault(_vm => _vm == _viewModel); 
    } 

MainView.xaml

<Window x:Class="MyProject.View.MainView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:v="clr-namespace:MyProject.View" 
     xmlns:vm="clr-namespace:MyProject.ViewModel" 
     xmlns:mp="clr-namespace:MyProject" 
     Title="MyProject" Height="630" Width="460" WindowStartupLocation="CenterScreen" SnapsToDevicePixels="True"> 
    <Window.Resources> 
     <DataTemplate DataType="{x:Type vm:MainViewViewModel}"> 
      <v:BeamView /> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type vm:AuthViewModel}"> 
      <v:AuthView/> 
     </DataTemplate> 
    </Window.Resources> 

    <Window.DataContext> 
     <vm:MainViewModel/> 
    </Window.DataContext> 

    <Grid> 
     <ContentControl Content="{Binding CurrentViewModel}" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/> 
    </Grid> 

</Window> 

ответ

1

dayum. <DateTemplate> не вызвал этой проблемы.

Я просто написал неправильный код на DelegateCommand класса

public override bool CanExecute(object parameter) 
{ 
    if (parameter != null) // what the hell ? 
     return true; 
    return _canExecute(parameter); 
} 

и я установил его

public override bool CanExecute(object parameter) 
{ 
    if (parameter == null) 
     return true; 
    return _canExecute(parameter); 
} 
Смежные вопросы