【发布时间】:2020-05-12 20:48:00
【问题描述】:
我正在做一个日常任务管理器。
我想在 MainWindow.xaml 中的 2 个不同的 ContentControl 中显示 2 个不同的视图。 我有一个 ViewModelMain,它包含两个 ViewModelBase 类型的属性。所以我可以在不同的ViewModel之间切换,因为它们都实现了ViewModelBase,它实现了INotifyPropertyChanged。只需一个 ContentControl,选择任何视图都没有问题。事实上,可以(在命令中配置时)从第二个 ContentControl 中正确选择视图模型。
现在我需要帮助...为什么我的第二个 ContentControl 没有显示任何内容? 我试图评估问题出在哪里,但 ViewModel 选择按预期传递并调用了 OnPropertyChanged 方法。
感谢您的帮助。
我的 ViewModelMain:
public class ViewModelMain : ViewModelBase {
private ViewModelBase selectedVMMain;
private ViewModelBase selectedVMEssentail;
public ViewModelBase SelectedVMMain {
get { return selectedVMMain; }
set {
if( selectedVMMain != value ) {
selectedVMMain = value;
OnPropertyChanged(nameof(selectedVMMain));
}
}
}
public ViewModelBase SelectedVMEssential {
get { return selectedVMEssentail; }
set {
if( selectedVMEssentail != value ) {
selectedVMEssentail = value;
OnPropertyChanged(nameof(selectedVMEssentail));
}
}
}
public ICommand CommandUpdateView { get; set; }
public ViewModelMain() {
this.CommandUpdateView = new CommandUpdateView(this);
}
}
CommandUpdateView:
private ViewModelMain viewModelMain;
public event EventHandler CanExecuteChanged;
public CommandUpdateView( ViewModelMain _viewModelMain) {
this.viewModelMain = _viewModelMain;
}
public bool CanExecute( object parameter ) => true;
public void Execute( object parameter ) {
switch( parameter ) {
case nameof(EnumViewModels.Übersicht):
viewModelMain.SelectedVMMain = new ViewModelÜbersicht();
break;
case nameof(EnumViewModels.Statistik):
viewModelMain.SelectedVMMain = new ViewModelStatistik();
break;
case nameof(EnumViewModels.Kategorie):
viewModelMain.SelectedVMEssential = new ViewModelKategorie();
break;
case nameof(EnumViewModels.Projekt):
viewModelMain.SelectedVMEssential = new ViewModelProjekt();
break;
case nameof(EnumViewModels.Aufgabe):
viewModelMain.SelectedVMEssential = new ViewModelAufgabe();
break;
case nameof(EnumViewModels.Pomodoro):
viewModelMain.SelectedVMEssential = new ViewModelPomodoro();
break;
default:
viewModelMain.SelectedVMMain = new ViewModelTEST();
viewModelMain.SelectedVMEssential = new ViewModelTEST();
break;
}
}
}
MainWindow.xaml(DataContext 设置为新的 ViewModelMain)
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition MinWidth="100" Width="Auto"/>
<ColumnDefinition MinWidth="200" Width="Auto"/>
<ColumnDefinition MinWidth="200" Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Top"
Grid.Column="0" Grid.Row="0"
Margin="5" Width="100" >
<Button x:Name="Button_Uebersicht" Content="Übersicht"
Command="{Binding CommandUpdateView}" CommandParameter="Übersicht"
HorizontalAlignment="Stretch" VerticalAlignment="Center"
Margin="0,5" />
<Button x:Name="Button_Statistik" Content="Statistik"
Command="{Binding CommandUpdateView}" CommandParameter="Statistik"
HorizontalAlignment="Stretch" VerticalAlignment="Center"
Margin="0,5" />
<Button x:Name="Button_Kategorie" Content="Kategorie"
Command="{Binding CommandUpdateView}" CommandParameter="Kategorie"
HorizontalAlignment="Stretch" VerticalAlignment="Center"
Margin="0,5" />
<Button x:Name="Button_Projekt" Content="Projekt"
Command="{Binding CommandUpdateView}" CommandParameter="Projekt"
HorizontalAlignment="Stretch" VerticalAlignment="Center"
Margin="0,5" />
<Button x:Name="Button_Aufgabe" Content="Aufgabe"
Command="{Binding CommandUpdateView}" CommandParameter="Aufgabe"
HorizontalAlignment="Stretch" VerticalAlignment="Center"
Margin="0,5" />
<Button x:Name="Button_Pomodoro" Content="Pomodoro"
Command="{Binding CommandUpdateView}" CommandParameter="Pomodoro"
HorizontalAlignment="Stretch" VerticalAlignment="Center"
Margin="0,5" />
<Button x:Name="Button_TEST" Content="TEST"
Command="{Binding CommandUpdateView}"
HorizontalAlignment="Stretch" VerticalAlignment="Center"
Margin="0,5" />
</StackPanel>
<ContentControl x:Name="CC_Main"
Content="{Binding SelectedVMMain}"
Grid.Column="1" Grid.Row="0"
Margin="5" Width="Auto"/>
<ContentControl x:Name="CC_Essential"
Content="{Binding SelectedVMEssential}"
Grid.Column="2" Grid.Row="0"
Margin="5" Width="Auto"/>
【问题讨论】:
-
您是否有合适的 DataTemplate 用于您在第二个 ContentControl 中使用的视图模型?此外,您是否尝试过在运行时使用 Snoop/Visual Studio 以确保绑定正常工作并且第二个 ContentControl 上的 DataContext 正确?
-
我已将 Mainwindow 的 DataContext 设置为 ViewModelMain。如果我将 ViewModelMain 声明为变量并将其添加到 MainWindow 和第二个 ContentControl 的上下文中,它仍然是相同的,所以这不是问题。数据模板也是正确的,因为如果我使用第一个内容控件来显示视图模型,它就可以工作!你能通过检查绑定来解释你的意思吗?
-
您在每次命令调用时都在实例化新的 VM 对象。尝试实例化一次,然后在命令调用时将现有 VM 分配给
SelectedVMEssential。