我想创建一个带有左侧菜单的应用程序,该菜单将更改右侧的内容。为此,我有一个带有两个ContentControl的MainWindow(一个将容纳一个UserControl'菜单',另一个将容纳所选的UserControl'红色'或'绿色'。
问题是右边的内容没有更改...
我进行了一些研究,看到了诸如依赖注入,委托,事件,消息总线,ViewModelLocator等概念。但是我不知道在这种情况下哪一个最合适,以及如何实现它。 (我不想使用MVVMLight或类似的任何插件)
为您的利益提前致谢。
为此,我使用MVVM模式和DataTemplate绑定:
App.xaml
<Application.Resources> <DataTemplate DataType="{x:Type viewModel:MainViewModel}"> <view:MainWindow /> </DataTemplate> <DataTemplate DataType="{x:Type viewModelMenu:LeftViewModel}"> <viewMenu:Left /> </DataTemplate> <DataTemplate DataType="{x:Type viewModelContent:RedViewModel}"> <viewContent:Red /> </DataTemplate> </Application.Resources>
ViewModel.cs
public abstract class ViewModel : INotifyPropertyChanged { #region Properties private ViewModel _mainContent; public ViewModel MainContent { get => _mainContent; set { _mainContent = value; OnPropertyChanged(); MessageBox.Show(nameof(MainContent)); } } #endregion Properties public ViewModel() { InitCommands(); } protected abstract void InitCommands(); #region Factory Method - CreateCommand protected ICommand CreateCommand(Action execute, Func<bool> canExecute) { return new RelayCommand( execute: execute, canExecute: canExecute ); } protected ICommand CreateCommand<T>(Action<T> execute, Predicate<T> canExecute) { return new RelayCommand<T>( execute: execute, canExecute: canExecute ); } #endregion Factory Method - CreateCommand public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = "") { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
MainViewModel.cs
internal class MainViewModel : ViewModel { private ViewModel _leftMenu; public ViewModel LeftMenu { get => _leftMenu; set { _leftMenu = value; OnPropertyChanged(); } } public MainViewModel() { LeftMenu = new LeftViewModel(); } protected override void InitCommands() { }
LeftViewModel.cs
internal class LeftViewModel : ViewModel { public ICommand ChangeContentToRed { get; set; } public ICommand ChangeContentToGreen { get; set; } protected override void InitCommands() { ChangeContentToRed = new RelayCommand( execute: () => MainContent = new RedViewModel(), canExecute: () => !(MainContent is RedViewModel) ); ChangeContentToGreen = new RelayCommand( execute: () => MainContent = new GreenViewModel(), canExecute: () => !(MainContent is GreenViewModel) ); } }
RedViewModel和GreenViewModel为空,所以我不显示代码,而是扩展ViewModel
Window.xaml
<Window.DataContext> <viewModel:MainViewModel /> </Window.DataContext> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="3*" /> </Grid.ColumnDefinitions> <ContentControl Grid.Column="0" Content="{Binding Path=LeftMenu}" /> <ContentControl Grid.Column="1" Content="{Binding Path=MainContent}" /> </Grid>
左xaml
<UserControl.DataContext>
<viewModel:LeftViewModel />
</UserControl.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Button
Grid.Row="0"
Command="{Binding Path=ChangeContentToRed}"
Content="Red" />
<Button
Grid.Row="1"
Command="{Binding Path=ChangeContentToGreen}"
Content="Green" />
</Grid>
红色和绿色只是两个带有红色和绿色网格的UserControl
我想创建一个带有左侧菜单的应用程序,该菜单将更改右侧的内容。为此,我有一个带有两个ContentControl的MainWindow(一个将容纳一个UserControl'Menu'和...
[当有类似DataTemplate的时候