用于层次信息的WPF DataGrids
本文关键字:WPF DataGrids 信息 层次 用于 | 更新日期: 2023-09-27 18:24:28
我有一个包含ObservableCollection<Foo>
的应用程序,而Foo
又包含ObservableCollection<Bar>
。我想要一对数据网格,一个显示应用程序中Foo
对象的集合,另一个显示当前在第一个数据网格中选择的Foo
中Bar
对象的集合(我希望能够添加、更新和删除这两个数据网格的条目)。
到目前为止,我得到了以下XAML:
<Window x:Class="Test.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<DataGrid Grid.Column="0" ItemsSource="{Binding Foos}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Foo Name" Binding="{Binding Name}" Width="Auto" IsReadOnly="False" />
</DataGrid.Columns>
</DataGrid>
<GridSplitter HorizontalAlignment="Right" VerticalAlignment="Stretch" Grid.Column="1" ResizeBehavior="PreviousAndNext" Width="5" Background="Gray" />
<DataGrid Grid.Column="2">
<DataGrid.Columns>
<DataGridTextColumn Header="Bar Name" Width="Auto" IsReadOnly="False"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
和以下代码:
using System;
using System.Windows;
using System.Collections.ObjectModel;
namespace Test
{
public class Foo
{
static int _nextId;
public int Id { get; private set; }
public String Name { get; set; }
public ObservableCollection<Bar> Bars { get; set; }
public Foo()
{
Id = _nextId++;
Name = String.Empty;
Bars = new ObservableCollection<Bar>();
}
}
public class Bar
{
static int _nextId;
public int Id { get; private set; }
public String Name { get; set; }
public Bar()
{
Id = _nextId++;
Name = String.Empty;
}
}
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public ObservableCollection<Foo> Foos { get; set; }
public MainWindow()
{
Foos = new ObservableCollection<Foo>();
Foo newFoo;
for (int index = 0; index < 5; ++index)
{
newFoo = new Foo();
newFoo.Name = String.Format("Foo {0}", index);
Foos.Add(newFoo);
}
InitializeComponent();
DataContext = this;
}
}
}
显然,我还没有绑定第二个DataGrid,因为我根本不知道如何绑定!我能找到的所有示例都假设我绑定的是DataTables,而不是自定义对象,并绑定到DataTables上的关系。我真的还不太了解绑定。有人能告诉我如何绑第二张桌子吗?
(是的,如果你看到我最近的其他问题,在早期处理得不好之后,我将再次尝试WPF)。
提前谢谢。
Hi如果你首先想要可编辑的网格,你必须像一样实现INotifyPropertyChanged
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new ViewModel();
}
}
public class ViewModel
{
public ViewModel()
{
Foos = new ObservableCollection<Foo>();
}
public ObservableCollection<Foo> Foos { get; set; }
}
public class Foo : INotifyPropertyChanged
{
static int _nextId;
public int Id { get; private set; }
public ObservableCollection<Bar> Bars { get; set; }
public Foo()
{
Id = _nextId++;
Name = String.Empty;
Bars = new ObservableCollection<Bar>();
}
private string name;
public string Name
{
get
{
return name;
}
set
{
name = value;
Notify("Name");
}
}
private void Notify(string propName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
public event PropertyChangedEventHandler PropertyChanged;
}
public class Bar : INotifyPropertyChanged
{
static int _nextId;
public int Id { get; private set; }
public Bar()
{
Id = _nextId++;
Name = String.Empty;
}
private string name;
public string Name
{
get
{
return name;
}
set
{
name = value;
Notify("Name");
}
}
private void Notify(string propName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
public event PropertyChangedEventHandler PropertyChanged;
}
在xaml中,第一个网格的绑定是正确的,对于第二个网格,您可以使用ElementName 将ItemsSource设置为第一个网格中的selectedItem
<DataGrid Grid.Column="2" ItemsSource="{Binding ElementName=gridTop, Path=SelectedItem.Bars}">
<DataGrid.Columns>
<DataGridTextColumn Header="Bar Name" Binding="{Binding Name}" Width="Auto" IsReadOnly="False"/>
</DataGrid.Columns>
</DataGrid>
使用绑定到元素
将顶部网格命名为顶部
DataContext="{Binding ElementName=gridTop, Path=SelectedItem.Bars}"