Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法为驻留在DataGrid的RowDetail中的DataGrid绑定列_C#_Wpf_Xaml_Mvvm_Datagrid - Fatal编程技术网

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;
}
};
}