指定要在运行时显示的几个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的新手,所以我可能错过了一些显而易见的东西。谢谢
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之间进行更改。
我很想知道为什么最初的绑定是错误的。然而,我现在要宣布一场小小的胜利,并把这个难题留给下一天。