我想在mvvm中创建母版页。我创建了一个viewbox
,其名称是用于显示我的usercontrol
的容器,我有两个类RelayCommand
和ViewModel
。
这是我的代码:
public class ViewModel
{
MainWindow objMainWindow = new MainWindow();
UserControls.History objHistory = new UserControls.History();
UserControls.NewItem objNewItem = new UserControls.NewItem();
UserControls.SideEffect objSideEffect = new UserControls.SideEffect();
public ViewModel()
{
OpenCommand = new RelayCommand(Open);
}
private ICommand openCommand;
public ICommand OpenCommand
{
get { return openCommand; }
set { openCommand = value; }
}
public void Open(object sender)
{
if (sender.ToString() == "btnHistory")
{
objMainWindow.Container.Child = objHistory;
}
if (sender.ToString() == "btnNewItem")
{
}
if (sender.ToString() == "btnSideEffect")
{
}
}
}
这是我的RelayCommand
:
public class RelayCommand:ICommand
{
public RelayCommand(Action<object> _action)
{
actionCommand = _action;
}
private Action<object> actionCommand;
public bool CanExecute(object parameter)
{
return true;
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public void Execute(object parameter)
{
if (parameter !=null)
{
actionCommand(parameter);
}
else
{
actionCommand("Null");
}
}
}
但是当我运行解决方案时,我想要向我的孩子展示容器时遇到NullRefrenceException
。
我不知道如何做这项工作。
答案 0 :(得分:0)
您的MainWindow
会在程序启动时实例化。因此,您不应该在ViewModel
中重新实例化它(即此行:MainWindow objMainWindow = new MainWindow();
)。您应该使用DataBinding
代替。
以下示例代码为您提供了一个想法:
首先在FrameworkElement
中定义ViewModel
类型的属性,并将其值设置为UserControl
方法中所需的Open
。
<强>视图模型:强>
public class ViewModel : INotifyPropertyChanged
{
FrameworkElement _myUc;
public FrameworkElement MyUserControl
{
get
{
return _myUc;
}
set
{
_myUc= value;
OnPropertyChanged("MyUserControl");
}
}
public ViewModel()
{
OpenCommand = new RelayCommand(Open);
}
public void Open(object sender)
{
if (sender.ToString() == "btnHistory")
{
MyUserControl = objHistory;
}
}
// rest of your view model ...
}
然后将ViewModel
实例化为DataContext
中MainWindow
的{{1}}。
<强>主窗口:强>
Constructor
最后使用public ViewModel MyViewModel { get; set; }
public MainWindow()
{
InitializeComponent();
MyViewModel = new ViewModel();
DataContext = MyViewModel;
}
(而不是ContentControl
)[查看我的注释]并将其ViewBox
绑定到{{1}您Content
的属性。
<强> XAML:强>
MyUserControl
这种方式每次ViewModel
更改时,<Grid >
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<ContentControl Grid.Row="0" Content="{Binding MyUserControl}" x:Name="Container"/>
<Button Grid.Row="1" Name="btnHistory" Content="ShowHistory" Command="{Binding OpenCommand}" />
</Grid>
都会显示您想要的MyUserControl
。
注意 ContentControl
的{{1}}属性不是UserControl
,因此无法绑定。