如何从外部设置DataGrid的DataSource?

时间:2012-05-23 19:41:46

标签: c# wpf wpf-controls

我在WPF中开发一个控件,我的控件包含一些其他WPF控件,如标签,按钮和一个DataGrid。所以,我一直在尝试创建一个依赖项属性,允许我从容器控件的外部获取dataGrid的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}/>

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

2 个答案:

答案 0 :(得分:2)

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

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

在您的自定义控件中,您可以使用以下命令绑定到MyData:

<DataGrid ItemsSource = "{Binding}"/>

答案 1 :(得分:1)

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

由于我需要从容器控件访问嵌套控件依赖项属性,所以我这样做了:

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}" />

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