C# 无法为驻留在DataGrid的RowDetail中的DataGrid绑定列
因此,我必须构建一个C# 无法为驻留在DataGrid的RowDetail中的DataGrid绑定列,c#,wpf,xaml,mvvm,datagrid,C#,Wpf,Xaml,Mvvm,Datagrid,因此,我必须构建一个UserControl来保存DataGrid。DataGrid的每个Row将有另一个DataGrid分别保存该行的详细信息 最初,由于列不是DP,我在将数据网格的列从调用者绑定到用户控件时遇到了一些问题,然后我通过附加属性克服了这个问题 这就是示例的外观 main window.xaml <Grid> <local:CustomDataGrid > <local:CustomDataGrid.Columns>
UserControl
来保存DataGrid
。DataGrid
的每个Row
将有另一个DataGrid
分别保存该行的详细信息
最初,由于列
不是DP,我在将数据网格
的列
从调用者绑定到用户控件
时遇到了一些问题,然后我通过附加属性克服了这个问题
这就是示例的外观
main window.xaml
<Grid>
<local:CustomDataGrid >
<local:CustomDataGrid.Columns>
<DataGridTextColumn Header="Emp Name" Binding="{Binding Name}" />
</local:CustomDataGrid.Columns>
<local:CustomDataGrid.RowDetailColumns>
<DataGridTextColumn Header="Manager Name" Binding="{Binding ManagerName}" />
</local:CustomDataGrid.RowDetailColumns>
</local:CustomDataGrid>
</Grid>
<Grid>
<DataGrid ItemsSource="{Binding Employees}" local:DataGridColumnsBehavior.BindableColumns="{Binding Columns, RelativeSource={RelativeSource AncestorType=UserControl}}">
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<DataGrid ItemsSource="{Binding Details}" local:DataGridColumnsBehavior.BindableColumns="{Binding RowDetailColumns, RelativeSource={RelativeSource AncestorType=UserControl}}"/>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
</Grid>
MainWindow.xaml.cs
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var emps = new List<Employee>();
emps.Add(new Employee() { ID = 1, Name = "aaa", Details = new List<Manager>() { new Manager() { ManagerID = 11, ManagerName = "Maaa" }, new Manager() { ManagerID = 22, ManagerName = "Mbbb" }, new Manager() { ManagerID = 33, ManagerName = "Mccc" } } });
emps.Add(new Employee() { ID = 1, Name = "aaa", Details = new List<Manager>() { new Manager() { ManagerID = 11, ManagerName = "Maaa" }, new Manager() { ManagerID = 22, ManagerName = "Mbbb" }, new Manager() { ManagerID = 33, ManagerName = "Mccc" } } });
emps.Add(new Employee() { ID = 1, Name = "aaa", Details = new List<Manager>() { new Manager() { ManagerID = 11, ManagerName = "Maaa" }, new Manager() { ManagerID = 22, ManagerName = "Mbbb" }, new Manager() { ManagerID = 33, ManagerName = "Mccc" } } });
emps.Add(new Employee() { ID = 1, Name = "aaa", Details = new List<Manager>() { new Manager() { ManagerID = 11, ManagerName = "Maaa" }, new Manager() { ManagerID = 22, ManagerName = "Mbbb" }, new Manager() { ManagerID = 33, ManagerName = "Mccc" } } });
Employees = emps;
this.DataContext = this;
}
public List<Employee> Employees { get; set; }
}
public class Employee
{
public int ID { get; set; }
public string Name { get; set; }
public List<Manager> Details { get; set; }
}
public class Manager
{
public int ManagerID { get; set; }
public string ManagerName { get; set; }
}
/// <summary>
/// Interaction logic for CustomDataGrid.xaml
/// </summary>
public partial class CustomDataGrid : UserControl
{
public CustomDataGrid()
{
InitializeComponent();
Columns = new ObservableCollection<DataGridColumn>();
RowDetailColumns = new ObservableCollection<DataGridColumn>();
}
public static DependencyProperty ColumnsProperty =
DependencyProperty.Register("Columns"
, typeof(ObservableCollection<DataGridColumn>)
, typeof(CustomDataGrid));
public static DependencyProperty RowDetailColumnsProperty =
DependencyProperty.Register("RowDetailColumns"
, typeof(ObservableCollection<DataGridColumn>)
, typeof(CustomDataGrid));
public ObservableCollection<DataGridColumn> Columns
{
get { return (ObservableCollection<DataGridColumn>)GetValue(ColumnsProperty); }
set { SetValue(ColumnsProperty, value); }
}
public ObservableCollection<DataGridColumn> RowDetailColumns
{
get { return (ObservableCollection<DataGridColumn>)GetValue(RowDetailColumnsProperty); }
set { SetValue(RowDetailColumnsProperty, value); }
}
}
//
///MainWindow.xaml的交互逻辑
///
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
var emps=新列表();
emps.Add(new Employee(){ID=1,Name=“aaa”,Details=new List(){new Manager(){ManagerID=11,ManagerName=“Maaa”},new Manager(){ManagerID=22,ManagerName=“Mbbb”},new Manager(){ManagerID=33,ManagerName=“Mccc”}});
emps.Add(new Employee(){ID=1,Name=“aaa”,Details=new List(){new Manager(){ManagerID=11,ManagerName=“Maaa”},new Manager(){ManagerID=22,ManagerName=“Mbbb”},new Manager(){ManagerID=33,ManagerName=“Mccc”}});
emps.Add(new Employee(){ID=1,Name=“aaa”,Details=new List(){new Manager(){ManagerID=11,ManagerName=“Maaa”},new Manager(){ManagerID=22,ManagerName=“Mbbb”},new Manager(){ManagerID=33,ManagerName=“Mccc”}});
emps.Add(new Employee(){ID=1,Name=“aaa”,Details=new List(){new Manager(){ManagerID=11,ManagerName=“Maaa”},new Manager(){ManagerID=22,ManagerName=“Mbbb”},new Manager(){ManagerID=33,ManagerName=“Mccc”}});
雇员=环境管理计划;
this.DataContext=this;
}
公共列表雇员{get;set;}
}
公营雇员
{
公共int ID{get;set;}
公共字符串名称{get;set;}
公共列表详细信息{get;set;}
}
公共班级经理
{
public int ManagerID{get;set;}
公共字符串管理器名称{get;set;}
}
CustomDataGrid.xaml
<Grid>
<local:CustomDataGrid >
<local:CustomDataGrid.Columns>
<DataGridTextColumn Header="Emp Name" Binding="{Binding Name}" />
</local:CustomDataGrid.Columns>
<local:CustomDataGrid.RowDetailColumns>
<DataGridTextColumn Header="Manager Name" Binding="{Binding ManagerName}" />
</local:CustomDataGrid.RowDetailColumns>
</local:CustomDataGrid>
</Grid>
<Grid>
<DataGrid ItemsSource="{Binding Employees}" local:DataGridColumnsBehavior.BindableColumns="{Binding Columns, RelativeSource={RelativeSource AncestorType=UserControl}}">
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<DataGrid ItemsSource="{Binding Details}" local:DataGridColumnsBehavior.BindableColumns="{Binding RowDetailColumns, RelativeSource={RelativeSource AncestorType=UserControl}}"/>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
</Grid>
CustomDataGrid.xaml.cs
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var emps = new List<Employee>();
emps.Add(new Employee() { ID = 1, Name = "aaa", Details = new List<Manager>() { new Manager() { ManagerID = 11, ManagerName = "Maaa" }, new Manager() { ManagerID = 22, ManagerName = "Mbbb" }, new Manager() { ManagerID = 33, ManagerName = "Mccc" } } });
emps.Add(new Employee() { ID = 1, Name = "aaa", Details = new List<Manager>() { new Manager() { ManagerID = 11, ManagerName = "Maaa" }, new Manager() { ManagerID = 22, ManagerName = "Mbbb" }, new Manager() { ManagerID = 33, ManagerName = "Mccc" } } });
emps.Add(new Employee() { ID = 1, Name = "aaa", Details = new List<Manager>() { new Manager() { ManagerID = 11, ManagerName = "Maaa" }, new Manager() { ManagerID = 22, ManagerName = "Mbbb" }, new Manager() { ManagerID = 33, ManagerName = "Mccc" } } });
emps.Add(new Employee() { ID = 1, Name = "aaa", Details = new List<Manager>() { new Manager() { ManagerID = 11, ManagerName = "Maaa" }, new Manager() { ManagerID = 22, ManagerName = "Mbbb" }, new Manager() { ManagerID = 33, ManagerName = "Mccc" } } });
Employees = emps;
this.DataContext = this;
}
public List<Employee> Employees { get; set; }
}
public class Employee
{
public int ID { get; set; }
public string Name { get; set; }
public List<Manager> Details { get; set; }
}
public class Manager
{
public int ManagerID { get; set; }
public string ManagerName { get; set; }
}
/// <summary>
/// Interaction logic for CustomDataGrid.xaml
/// </summary>
public partial class CustomDataGrid : UserControl
{
public CustomDataGrid()
{
InitializeComponent();
Columns = new ObservableCollection<DataGridColumn>();
RowDetailColumns = new ObservableCollection<DataGridColumn>();
}
public static DependencyProperty ColumnsProperty =
DependencyProperty.Register("Columns"
, typeof(ObservableCollection<DataGridColumn>)
, typeof(CustomDataGrid));
public static DependencyProperty RowDetailColumnsProperty =
DependencyProperty.Register("RowDetailColumns"
, typeof(ObservableCollection<DataGridColumn>)
, typeof(CustomDataGrid));
public ObservableCollection<DataGridColumn> Columns
{
get { return (ObservableCollection<DataGridColumn>)GetValue(ColumnsProperty); }
set { SetValue(ColumnsProperty, value); }
}
public ObservableCollection<DataGridColumn> RowDetailColumns
{
get { return (ObservableCollection<DataGridColumn>)GetValue(RowDetailColumnsProperty); }
set { SetValue(RowDetailColumnsProperty, value); }
}
}
//
///CustomDataGrid.xaml的交互逻辑
///
公共部分类CustomDataGrid:UserControl
{
公共CustomDataGrid()
{
初始化组件();
Columns=新的ObservableCollection();
RowDetailColumns=新的ObservableCollection();
}
公共静态从属属性列属性=
DependencyProperty.Register(“列”
,类型(可观测采集)
,typeof(CustomDataGrid));
公共静态从属属性RowDetails ColumnSProperty=
DependencyProperty.Register(“RowDetailColumns”
,类型(可观测采集)
,typeof(CustomDataGrid));
公共可观测收集列
{
get{return(ObservableCollection)GetValue(ColumnsProperty);}
set{SetValue(ColumnsProperty,value);}
}
公共ObservableCollection行详细信息列
{
get{return(ObservableCollection)GetValue(RowDetailColumnsProperty);}
set{SetValue(rowdailColumnsProperty,value);}
}
}
DataGridColumnsBehavior.cs///列的附加属性
public static class DataGridColumnsBehavior
{
public static readonly DependencyProperty BindableColumnsProperty =
DependencyProperty.RegisterAttached("BindableColumns",
typeof(ObservableCollection<DataGridColumn>),
typeof(DataGridColumnsBehavior),
new UIPropertyMetadata(null, BindableColumnsPropertyChanged));
private static void BindableColumnsPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
{
DataGrid dataGrid = source as DataGrid;
ObservableCollection<DataGridColumn> columns = e.NewValue as ObservableCollection<DataGridColumn>;
dataGrid.Columns.Clear();
if (columns == null)
{
return;
}
foreach (DataGridColumn column in columns)
{
dataGrid.Columns.Add(column);
}
columns.CollectionChanged += (sender, e2) =>
{
NotifyCollectionChangedEventArgs ne = e2 as NotifyCollectionChangedEventArgs;
if (ne.Action == NotifyCollectionChangedAction.Reset)
{
dataGrid.Columns.Clear();
if (ne.NewItems != null)
{
foreach (DataGridColumn column in ne.NewItems)
{
dataGrid.Columns.Add(column);
}
}
}
else if (ne.Action == NotifyCollectionChangedAction.Add)
{
foreach (DataGridColumn column in ne.NewItems)
{
dataGrid.Columns.Add(column);
}
}
else if (ne.Action == NotifyCollectionChangedAction.Move)
{
dataGrid.Columns.Move(ne.OldStartingIndex, ne.NewStartingIndex);
}
else if (ne.Action == NotifyCollectionChangedAction.Remove)
{
foreach (DataGridColumn column in ne.OldItems)
{
dataGrid.Columns.Remove(column);
}
}
else if (ne.Action == NotifyCollectionChangedAction.Replace)
{
dataGrid.Columns[ne.NewStartingIndex] = ne.NewItems[0] as DataGridColumn;
}
};
}
public static void SetBindableColumns(DependencyObject element, ObservableCollection<DataGridColumn> value)
{
element.SetValue(BindableColumnsProperty, value);
}
public static ObservableCollection<DataGridColumn> GetBindableColumns(DependencyObject element)
{
return (ObservableCollection<DataGridColumn>)element.GetValue(BindableColumnsProperty);
}
}
公共静态类DataGridColumnsBehavior
{
公共静态只读从属属性BindableColumnsProperty=
DependencyProperty.RegisterAttached(“BindableColumns”,
类型(可观测采集),
类型(DataGridColumnsBehavior),
新的UIPropertyMetadata(null,BindableColumnsPropertyChanged));
私有静态void BindableColumnsPropertyChanged(DependencyObject源,DependencyPropertyChangedEventArgs e)
{
DataGrid DataGrid=源作为DataGrid;
ObservableCollection columns=e.NewValue作为ObservableCollection;
dataGrid.Columns.Clear();
如果(列==null)
{
返回;
}
foreach(列中的DataGridColumn列)
{
dataGrid.Columns.Add(column);
}
columns.CollectionChanged+=(发送方,e2)=>
{
NotifyCollectionChangedEventArgs ne=e2作为NotifyCollectionChangedEventArgs;
if(ne.Action==NotifyCollectionChangedAction.Reset)
{
dataGrid.Columns.Clear();
如果(ne.NewItems!=null)
{
foreach(ne.NewItems中的DataGridColumn列)
{
dataGrid.Columns.Add(column);
}
}
}
else if(ne.Action==NotifyCollectionChangedAction.Add)
{
foreach(ne.NewItems中的DataGridColumn列)
{
dataGrid.Columns.Add(column);
}
}
else if(ne.Action==NotifyCollectionChangedAction.Move)
{
dataGrid.Columns.Move(ne.OldStartingIndex,ne.NewStartingIndex);
}
else if(ne.Action==NotifyCollectionChangedAction.Remove)
{
foreach(ne.OldItems中的DataGridColumn列)
{
dataGrid.Columns.Remove(column);
}
}
else if(ne.Action==NotifyCollectionChangedAction.Replace)
{
dataGrid.Columns[ne.NewStartingIndex]=ne.NewItems[0]作为DataGridColumn;
}
};
}