指定要在运行时显示的几个WPF数据网格之一

本文关键字:WPF 几个 数据 数据网 网格 运行时 显示 | 更新日期: 2023-09-27 18:24:40

在我的应用程序中,我希望有一个下拉框来选择要编辑的表(大约20个)。每个表都应该由自己的WPF DataGrid表示。(我曾想过使用一个DataGrid,并在运行时使用代码创建一组新列,但这似乎不太像XAML。)

我的下拉列表位于UserControl中(因为它是更大应用程序的一部分)。我相信(根据我的研究),20个DataGrids中的一个的占位符应该是ContentControl,用作占位符:

<UserControl x:Class="MyClass" ...
         xmlns:my="clr-namespace:MyNamespace"
         DataContext="{Binding ViewModel}">
<StackPanel>
    <Grid>
        <ComboBox Name="DataPaneComboBox" HorizontalAlignment="Stretch" 
                  IsReadOnly="True" MinWidth="120" 
                  Focusable="False" SelectedIndex="0"
                  DockPanel.Dock="Left" Grid.Column="0"
                  SelectionChanged="DataPaneComboBox_SelectionChanged">
            <ComboBoxItem Name="FirstOption" Content="Choice 1" />
            <ComboBoxItem Name="SecondOption" Content="Choice 2" />
            <ComboBoxItem Name="ThirdOption" Content="Choice 3" />
        </ComboBox>
    </Grid>
    <ContentControl Name="DataGridView" Margin="0,3,0,3" Content="{Binding CurrentView}" />
</StackPanel>

这是我为这个类编写的代码:

public partial class MyClass : UserControl {
    private MyViewModel ViewModel {
        get; set;
    }
    public MyClass() {
        InitializeComponent();
        ViewModel = new MyViewModel();
        ViewModel.CurrentView = new DataGridChoice1();
    }
}

ViewModel(类ObservableObject实现INotifyPropertyChanged接口):

public class MyViewModel : ObservableObject {
    private UserControl _currentView;
    public UserControl CurrentView {
        get {
            if (this._currentView == null) {
                this._currentView = new DatGridChoice1();
            }
            return this._currentView;
        }
        set {
            this._currentView = value;
            RaisePropertyChanged("CurrentView");
        }
    }
    #endregion
}

在运行时可以替换的大约20个UserControls中的一个:

<UserControl x:Class="Choice1Control"
             xmlns:my="clr-namespace:MyNamespace">
    <DataGrid ItemsSource="{Binding Choice1Objects}" />
        <!-- ... -->
    </DataGrid>
</UserControl>

当用户更改下拉列表时,我希望程序加载适当的DataGrid。现在我看不到子UserControl(此处为Choice1Control)。我已经直接添加了子项(没有插入ContentControl),它运行良好。

我已经尝试了DataContext和UserControl内容绑定的每一种组合。我是WPF的新手,所以我可能错过了一些显而易见的东西。谢谢

指定要在运行时显示的几个WPF数据网格之一

Path需要一个Source(Source、DataContext、RelativeSource、ElementName)。ElementName只能用于引用XAML中由x:Name声明的元素。

出于某种原因,我从未想过在运行时会在日志中清楚地写入绑定错误。我四处闲逛,直到我真正得到了一条有用的信息,并能够找到问题的根源。

根UserControl的DataContext似乎在被ContentControl继承之前就被截获了。(或者,我对DataContext是如何继承/传播的印象是错误的。)

最后,我更改了MyClass构造函数,将DataContext显式指定为ViewModel

public MyClass() {
    InitializeComponent();
    ViewModel = new MyViewModel();
    ViewModel.CurrentView = new DataGridChoice1();            
    this.DataContext = ViewModel;                      // <-- Added this line
}

绑定然后按预期工作,并且我能够在下拉框更改状态时在多个DataGrids之间进行更改。

我很想知道为什么最初的绑定是错误的。然而,我现在要宣布一场小小的胜利,并把这个难题留给下一天。