2009-06-05 189 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; 

您設置的值,但刪除您的結合!