我有一个包装网格的用户控件.我希望能够设置底层网格的数据源,但是通过用户控件,如下所示:
<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)
但这不起作用(它也没有给我一个错误).永远不会设置数据源.我错过了什么?
当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)
| 归档时间: |
|
| 查看次数: |
3626 次 |
| 最近记录: |