2009-06-05 69 views
2

我有一个包装网格的用户控件。我希望能够设置底层网格的数据源,而是通过用户的控制,就像这样:如何在wpf用户控件上创建DataSource依赖属性

<my:CustomGrid DataSource="{Binding Path=CollectionView}" /> 

我已经在网格设置这是这样的:

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

但是这并未没有用(它也不给我一个错误)。数据源从未设置。我错过了什么?

回答

8

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

你应该做的是重写OnPropertyChanged方法(自DependencyObject):

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

,并做实际上是相同的:

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

     if(e.Property == DataSourceProperty) { 
      underlyingGrid.DataSource = e.NewValue; 
     } 
    } 

或者您可以在注册的DependencyProperty指定一个回调以上在OnPropertyChanged中回调:

public static void DataSourceChanged(DependencyObject element, DependencyPropertyChangedEventArgs e) { 
     MyGridControl c = (MyGridControl) element; 
     c.underlyingGrid.DataSource = e.NewValue; 
    } 
+2

+1另一个选项(清洁,恕我直言)是从XAML绑定。即。在声明网格的用户控件中,执行类似于 2009-06-06 09:38:20

1

这是确定:

public static readonly DependencyProperty ItemsSourceProperty = 
      DependencyProperty.Register("ItemsSource", typeof(IList), typeof(YourControl), 
      newFrameworkPropertyMetadata(null,FrameworkPropertyMetadataOptions.AffectsArrange,new PropertyChangedCallback(OnIsChanged))); 

private static void OnIsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      YourControl c = (YourControl)d; 
      c.OnPropertyChanged("ItemsSource"); 
     } 

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

的问题在这里: 当您设置

MyGridControl c = (MyGridControl) element; 
c.underlyingGrid.DataSource = e.NewValue; 

您设置的值,但删除您的结合!