簡體   English   中英

c# MVVM:如何將 2 個 ContentControls 綁定到 MainViewModel 的 2 個屬性

[英]c# MVVM: How to bind 2 ContentControls to 2 Properties of MainViewModel

我正在做一個日常任務管理器。

我想在我的 MainWindow.xaml 中的 2 個不同的 ContentControls 內顯示 2 個不同的視圖。 我有一個 ViewModelMain,它包含兩個 ViewModelBase 類型的屬性。 所以我可以在不同的ViewModel之間切換,因為它們都實現了ViewModelBase,它實現了INotifyPropertyChanged。 只需一個 ContentControl,選擇任何視圖都沒有問題。 事實上,有可能(在命令中配置時)select 來自第二個 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);
        }

}

命令更新視圖:

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"/>

解決了

是字段,拼寫錯誤...屬性命名正確,但綁定不起作用,因為我使用了 nameof(field) 關鍵字...

感謝 Stack Overflow 上的精彩介紹!!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM