C# 将DataGrid.Columns集合绑定到自定义WPF UserControl中的祖先

C# 将DataGrid.Columns集合绑定到自定义WPF UserControl中的祖先,c#,wpf,xaml,datagrid,user-controls,C#,Wpf,Xaml,Datagrid,User Controls,DI试图将DataGrid.Columns属性公开给祖先用户控件,就像我使用。似乎没有任何属性可供我以以下方式绑定DataColumns: <PagedDataGrid> <PagedDataGrid.Columns> <DataGridTextColumn Header="Custom Column"/> <PagedDataGrid.Columns> </PagedDataGrid> 这是我到目

DI试图将DataGrid.Columns属性公开给祖先用户控件,就像我使用。似乎没有任何属性可供我以以下方式绑定DataColumns:

<PagedDataGrid>
    <PagedDataGrid.Columns>
        <DataGridTextColumn Header="Custom Column"/>
    <PagedDataGrid.Columns>
</PagedDataGrid>

这是我到目前为止所拥有的。我是否需要以某种方式在代码背后这样做

XAML:


分页控件。。。
C#:

命名空间WpfPagedGrid{
公共部分类PagedTagRid:UserControl{
公共页面标记(){InitializeComponent();}
公共IEnumerable ItemsSource{
get{return(IEnumerable)GetValue(ItemsSourceProperty);}
set{SetValue(ItemsSourceProperty,value);}
}
public static readonly dependencProperty ItemsSourceProperty=DataGrid.ItemsSourceProperty.AddOwner(typeof(PagedDataGrid));
//不工作,因为没有DataGrid.Columns属性。。。
//公共可观测收集列{
//get{return(ObservableCollection)GetValue(ColumnsProperty);}
//set{SetValue(ItemsSourceProperty,value);}
//}
//public static readonly dependencProperty ColumnsProperty=DataGrid.CloumnsProperty.AddOwner(typeof(PagedDataGrid));
}
}
编辑:
为了澄清,我试图在用户控件上指定列,并将DataGrid绑定到这些列。

由于
DataGrid.columns
是只读集合,因此无法直接绑定。相反,你可以通过通常所说的附加行为来实现这一点。基本上:

  • 创建一个带有类型为
    ObservableCollection
  • 将此类绑定到UserControl上的集合,并将其附加到DataGrid
  • 在[Property]上的
    已更改的
    处理程序中,附加属性的发送者将是
    DataGrid
    实例,传入的集合将是您的列。然后可以设置
    DataGrid
因此,在代码中:

<DataGrid Name="dataGrid" ...
    MyColumnHelper.Columns="{Binding RelativeSource={RelativeSource FindAncestor,
    AncestorType=local:PagedDataGrid, AncestorLevel=1}, Path=MyColumns}" />
警告—上面的代码是针对用户控件上的基础集合每次要添加或删除列时都会创建新集合的情况编写的。虽然您可以使用
可观测收集
,但您会遇到一些复杂问题:

  • 您必须在上面的事件处理程序中订阅其
    CollectionChanged
    事件
  • 然后,您必须使用弱事件,或者订阅
    DataGrid.unload
    事件,这样您就可以取消订阅
    CollectionChanged
    并防止内存泄漏(如果用户控件的生命周期比数据网格的生命周期长,或者数据网格曾被卸载并重新加载到可视化树中,这将是一个问题)

是否尝试在用户控件上指定列并将DataGrid绑定到这些列?还是尝试让用户控件知道DataGrid有哪些列?我尝试在用户控件上指定列并将DataGrid绑定到这些列。
namespace WpfPagedGrid {
    public partial class PagedDataGrid : UserControl {
        public PagedDataGrid() { InitializeComponent(); }

        public IEnumerable ItemsSource {
            get { return (IEnumerable)GetValue(ItemsSourceProperty); }
            set { SetValue(ItemsSourceProperty, value); }
        }

        public static readonly DependencyProperty ItemsSourceProperty = DataGrid.ItemsSourceProperty.AddOwner(typeof(PagedDataGrid));

        //Does not work as there is no DataGrid.Columns property...
        //public ObservableCollection<DataGridColumn> Columns {
            //get { return (ObservableCollection<DataGridColumn>)GetValue(ColumnsProperty); }
            //set { SetValue(ItemsSourceProperty, value); }
        //}

        //public static readonly DependencyProperty ColumnsProperty = DataGrid.CloumnsProperty.AddOwner(typeof(PagedDataGrid));
    }
}
<DataGrid Name="dataGrid" ...
    MyColumnHelper.Columns="{Binding RelativeSource={RelativeSource FindAncestor,
    AncestorType=local:PagedDataGrid, AncestorLevel=1}, Path=MyColumns}" />
OnMyColumnHelperColumnsChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
{
    DataGrid.Columns.Clear();
    foreach(var column in (IEnumerable)args.NewValue)
    {
        DataGrid.Columns.Add(column);
    }
}