【问题标题】:c# MVVM: How to bind 2 ContentControls to 2 Properties of MainViewModelc# MVVM:如何将 2 个 ContentControls 绑定到 MainViewModel 的 2 个属性
【发布时间】: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
  • 并考虑改进ICommand 的实现,因为它建议hereexample。目前,很难理解您的代码做什么以及虚拟机如何初始化,以及它最初在哪里获取值。

标签: c# wpf mvvm


【解决方案1】:

已解决

这是字段,拼写错误...属性命名正确,但绑定不起作用,因为我使用了 nameof(field) 关键字...

感谢 Stack Overflow 的精彩介绍!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2017-07-06
    • 2016-09-26
    • 1970-01-01
    相关资源
    最近更新 更多