gpt4 book ai didi

c# - 如何在 MVVM 中创建母版页?

转载 作者:太空宇宙 更新时间:2023-11-03 15:34:45 25 4
gpt4 key购买 nike

我想在 mvvm 中创建母版页。我创建了一个 viewbox,它的名字是显示我的 usercontrol 的容器,我有两个类,RelayCommandViewModel.

这是我的代码:

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 问题,因为它想显示我的容器子项。我不知道如何进行这项工作。

最佳答案

你的 MainWindow在程序启动时实例化。所以你不应该在你的 ViewModel 中再次实例化它(即这一行:MainWindow objMainWindow = new MainWindow();)。你应该使用 DataBinding反而。

下面是一个示例代码,可以让您了解一下:

首先定义一个类型为FrameworkElement的属性在你里面ViewModel并将其值设置为您想要的 UserControlOpen方法。

View 模型:

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你的MainWindowConstructor .

主窗口:

public ViewModel MyViewModel { get; set; }
public MainWindow()
{
InitializeComponent();
MyViewModel = new ViewModel();
DataContext = MyViewModel;
}

最后使用 ContentControl (而不是 ViewBox )[请参阅我的笔记] 并将其绑定(bind)为 ContentMyUserControl你的属性(property)ViewModel .

XAML:

<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显示您想要的 UserControl .

注意 Child ViewBox的属性(property)不是 DependencyProperty因此不可绑定(bind)。

关于c# - 如何在 MVVM 中创建母版页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32164236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com