如何在wpf用户控件上创建DataSource依赖项属性

Mic*_*eth 2 c# wpf

我有一个包装网格的用户控件.我希望能够设置底层网格的数据源,但是通过用户控件,如下所示:

<my:CustomGrid DataSource="{Binding Path=CollectionView}" />
Run Code Online (Sandbox Code Playgroud)

我在网格中设置了这样:

    private static readonly DependencyProperty DataSourceProperty 
        = DependencyProperty.Register("DataSource", typeof(IEnumerable), typeof(CustomGrid));

    public IEnumerable DataSource
    {
        get { return (IEnumerable)GetValue(DataSourceProperty); }
        set
        {
            SetValue(DataSourceProperty, value);
            underlyingGrid.DataSource = value;
        }
    }
Run Code Online (Sandbox Code Playgroud)

但这不起作用(它也没有给我一个错误).永远不会设置数据源.我错过了什么?

Ada*_*lls 8

当WPF加载您的控件并遇到XAML中指定的DependencyProperty时,它使用DependencyObject.SetValue来设置属性值而不是类的属性.这使得作为依赖属性的属性设置器中的自定义代码几乎无用.

你应该做的是覆盖OnPropertyChanged方法(来自DependencyObject):

    protected override void OnPropertyChanged( DependencyPropertyChangedEventArgs e ) {
        base.OnPropertyChanged( e );

        if( e.Property == DataSourceProperty ) {
            underlyingGrid.DataSource = e.NewValue;
        }
    }
Run Code Online (Sandbox Code Playgroud)

或者,您可以在注册DependencyProperty时指定回调:

    public static readonly DependencyProperty DataSourceProperty =
        DependencyProperty.Register( "DataSource", typeof( IEnumerable ), typeof( MyGridControl ), new PropertyMetadata( DataSourceChanged ) );
Run Code Online (Sandbox Code Playgroud)

并且在回调中的OnPropertyChanged中有效地与上面相同:

    public static void DataSourceChanged( DependencyObject element, DependencyPropertyChangedEventArgs e ) {
        MyGridControl c = (MyGridControl) element;
        c.underlyingGrid.DataSource = e.NewValue;
    }
Run Code Online (Sandbox Code Playgroud)

  • +1另一个选项(清洁,恕我直言)是从XAML绑定.即.在您声明Grid的UserControl中,执行类似<DataGrid ItemsSource ="{Binding DataSource,...}"/>的操作 (2认同)