C# 如何设置DataGrid';来自外部的数据源是什么?

C# 如何设置DataGrid';来自外部的数据源是什么?,c#,wpf,wpf-controls,C#,Wpf,Wpf Controls,我正在WPF中开发一个控件,我的控件包含一些其他WPF控件,例如标签、按钮和一个DataGrid。因此,我一直在尝试创建一个依赖属性,它允许我从容器控件外部获取dataGrid的数据源 到目前为止,我有以下代码: public static readonly DependencyProperty dataSourceProperty = DependencyProperty.Register(

我正在WPF中开发一个控件,我的控件包含一些其他WPF控件,例如标签、按钮和一个DataGrid。因此,我一直在尝试创建一个依赖属性,它允许我从容器控件外部获取dataGrid的数据源

到目前为止,我有以下代码:

public static readonly DependencyProperty dataSourceProperty = DependencyProperty.Register(
                                                                            "DataSource",
                                                                            typeof(object),
                                                                            typeof(MyCustomControl));
    public object DataSource
    {
        get
        {
            return (object)GetValue(dataSourceProperty);
        }
        set
        {
            SetValue(dataSourceProperty, value);
        }
    }
    myDataGrid.ItemsSource = DataSource;
但我不知道我必须在哪里写这段代码:

public static readonly DependencyProperty dataSourceProperty = DependencyProperty.Register(
                                                                            "DataSource",
                                                                            typeof(object),
                                                                            typeof(MyCustomControl));
    public object DataSource
    {
        get
        {
            return (object)GetValue(dataSourceProperty);
        }
        set
        {
            SetValue(dataSourceProperty, value);
        }
    }
    myDataGrid.ItemsSource = DataSource;
我的意思是,我需要的是,在我的xaml文件中,能够做到:

<MyCustomControl Name="MyControl" DataSource={Binding MyData}/>


我希望你能帮助我。提前感谢。

假设当前表单的datacontext具有MyData属性,您只需要以下内容:

<MyCustomControl Name="MyControl" DataContext={Binding MyData}/>

在自定义控件中,您可以通过以下方式绑定到MyData:

<DataGrid ItemsSource = "{Binding}"/>

假设当前表单的datacontext有一个属性MyData,您只需要以下内容:

<MyCustomControl Name="MyControl" DataContext={Binding MyData}/>

在自定义控件中,您可以通过以下方式绑定到MyData:

<DataGrid ItemsSource = "{Binding}"/>

经过几个小时的研究,我找到了解决问题的方法:

由于我需要从容器控件访问嵌套控件依赖项属性,因此我执行了以下操作:

public static readonly DependencyProperty itemsSourceProperty = ItemsControl.ItemsSourceProperty.AddOwner(
                                                                        typeof(MyCustomControl), 
                                                                        new FrameworkPropertyMetadata(
                                                                            ItemsSourcePropertyChangedCallback));

    public System.Collections.IEnumerable ItemsSource
    {
        get
        { return (System.Collections.IEnumerable)GetValue(itemsSourceProperty); }

        set
        { SetValue(itemsSourceProperty, value); }
    }

    private static void ItemsSourcePropertyChangedCallback(DependencyObject controlInstance, DependencyPropertyChangedEventArgs args)
    {
        MyCustomControlraceUIGridControlInstance = (MyCustomControl)controlInstance;  
        raceUIGridControlInstance.extendedDataGrid.ItemsSource = (System.Collections.IEnumerable)args.NewValue;            
    }
完成此操作后,您可以在XAML中编写:

<MyCustomControl Name=mycustomControl ItemsSource="{Binding YourData}" />


您可以使用任何嵌套控件依赖项属性执行此操作。

经过几个小时的研究,我找到了问题的解决方案:

由于我需要从容器控件访问嵌套控件依赖项属性,因此我执行了以下操作:

public static readonly DependencyProperty itemsSourceProperty = ItemsControl.ItemsSourceProperty.AddOwner(
                                                                        typeof(MyCustomControl), 
                                                                        new FrameworkPropertyMetadata(
                                                                            ItemsSourcePropertyChangedCallback));

    public System.Collections.IEnumerable ItemsSource
    {
        get
        { return (System.Collections.IEnumerable)GetValue(itemsSourceProperty); }

        set
        { SetValue(itemsSourceProperty, value); }
    }

    private static void ItemsSourcePropertyChangedCallback(DependencyObject controlInstance, DependencyPropertyChangedEventArgs args)
    {
        MyCustomControlraceUIGridControlInstance = (MyCustomControl)controlInstance;  
        raceUIGridControlInstance.extendedDataGrid.ItemsSource = (System.Collections.IEnumerable)args.NewValue;            
    }
完成此操作后,您可以在XAML中编写:

<MyCustomControl Name=mycustomControl ItemsSource="{Binding YourData}" />


您可以使用任何嵌套控件依赖属性来执行此操作。

WPF控件的子控件继承其DataContext,因此,除非我遗漏了什么,否则只需在XAML中设置DataGrid的
ItemsSource=“{Binding}”
就可以将其绑定到
MyData
…非常感谢您的回复,但因为我是WPF的新手,你能用一些例子来回答吗?我希望WPF控件的子控件继承它的DataContext,因此,除非我遗漏了什么,否则在XAML中简单地设置DataGrid的
ItemsSource=“{Binding}”
应该会导致它绑定到
MyData
…非常感谢您的回复,但是由于我对WPF完全陌生,你能用一些例子来说明你的答案吗?非常感谢您的回复,但是,如果我需要在容器控件中添加以下更多属性,该怎么办:
。我的内部dataGrid如何知道要获取哪些数据?谢谢您的回复,但是,如果我需要在容器控件中添加以下更多属性,该怎么办:
。我的内部dataGrid如何知道要获取哪些数据?