C# 查看isn';MVVM中的t显示
我正在尝试使用mvvm设计模式。我搜索并阅读了许多mvvm文档和示例,但这对我来说真的很难 我想从主窗口导航并显示视图,但我的代码不起作用 如果没有C# 查看isn';MVVM中的t显示,c#,mvvm,C#,Mvvm,我正在尝试使用mvvm设计模式。我搜索并阅读了许多mvvm文档和示例,但这对我来说真的很难 我想从主窗口导航并显示视图,但我的代码不起作用 如果没有~部分,ContentControl元素将显示文本“MyProject.ViewModel.AuthViewModel” 但是如果我把部分,NullReferenceException:objectreference未设置为对象的实例。在MyProject.Helper.DelegateCommand.CanExecute(对象参数)处发生错误 怎么
~
部分,ContentControl元素将显示文本“MyProject.ViewModel.AuthViewModel”
但是如果我把
部分,NullReferenceException:objectreference未设置为对象的实例。在MyProject.Helper.DelegateCommand.CanExecute(对象参数)
处发生错误
怎么了
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);
}
public类MainViewModel:ViewModelBase
{
专用ICommand _changeViewCommand;
私有ViewModelBase\u currentViewModel;
私有列表视图模型;
公共主视图模型(){
添加(新的AuthViewModel());
CurrentViewModel=ViewModels[0];
}
#区域命令
公共ICommand ChangeViewCommand
{
得到
{
如果(_changeViewCommand==null)
{
_changeViewCommand=新的DelegateCommand(
param=>ChangeViewModel((ViewModelBase)param),
param=>param是ViewModelBase
);
}
返回_changeViewCommand;
}
}
#端区
#区域属性
公共列表视图模型
{
得到
{
如果(_viewModels==null)
_viewModels=新列表();
返回视图模型;
}
}
公共视图模型库CurrentViewModel
{
得到
{
返回_currentViewModel;
}
设置
{
if(_currentViewModel!=值)
{
_currentViewModel=值;
RaisePropertyChanged(“CurrentViewModel”);
}
}
}
#端区
私有void ChangeViewModel(ViewModelBase\u viewModel)
{
如果(_viewModel!=null&&!ViewModels.Contains(_viewModel))
添加(_viewModel);
CurrentViewModel=ViewModels.FirstOrDefault(\u vm=>\u vm==\u 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>
dayum.没有导致此问题
我刚刚在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);
}