【发布时间】:2018-10-02 06:43:28
【问题描述】:
我创建了一个名为“ItemsPerPage”的带有 DependencyProperty 的自定义控件。我在一个窗口中使用了那个自定义控件。现在,如果我将值直接分配给 ItemsPerPage 属性,那么它可以工作,但是如果我将它与窗口中定义的属性绑定,那么它就无法工作。
自定义控件声明。
public class SmartDataGrid : DataGrid
{
public SmartDataGrid()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(SmartDataGrid), new FrameworkPropertyMetadata(typeof(SmartDataGrid)));
}
public static readonly DependencyProperty ItemsPerPageProperty =
DependencyProperty.Register("ItemsPerPage", typeof(Int32),
typeof(SmartDataGrid)
, new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnItemsPerPageChanged, CoerceTextProperty, true, UpdateSourceTrigger.PropertyChanged));
public Int32 ItemsPerPage
{
get
{
return (Int32)GetValue(ItemsPerPageProperty);
}
set
{
SetValue(ItemsPerPageProperty, value);
}
}
private static void OnItemsPerPageChanged(DependencyObject defectImageControl, DependencyPropertyChangedEventArgs eventArgs)
{
var control = (SmartDataGrid)defectImageControl;
control.callmyInstanceMethod(eventArgs);
}
private static object CoerceTextProperty(DependencyObject d, object value)
{
return value ?? 0;
}
private void callmyInstanceMethod(DependencyPropertyChangedEventArgs e)
{
ItemsPerPage = (Int32)e.NewValue;
}
}
现在我创建了一个新的 WPF 项目,并在 Window1 中使用了这个自定义控件,如下所示。
<Grid>
<sg:SmartDataGrid ItemsPerPage="{Binding ipp}"></sg:SmartDataGrid>
</Grid>
这里的sg:是一个命名空间声明添加自定义控件项目的引用。并且在Window1的.cs文件中我已经声明了一个属性。
public partial class Window1 : Window, INotifyPropertyChanged
{
int _ipp;
public int ipp
{ get { return _ipp; } set { _ipp = value; RaisePropertyChanged(); } }
public Window1()
{
ipp = 30;
InitializeComponent();
}
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
但值 30 未分配给 ItemsPerPage 属性。它总是显示0。
如果我直接分配 30 ItemsPerPage="30"。然后它就可以工作了。
【问题讨论】:
-
属性的每次更改都必须通知才能使绑定正常工作。这里没有魔法。一个普通的类(ViewModel,Model,...)应该实现 INotifyPropertyChanged,从 DependencyObject 派生的类应该使用 DependencyProperty(Window 是从 DependencyObject 派生的)
-
我已经实现了 NotifyPropertyChanged 但仍然无法正常工作
-
@SirRufo,我认为DataGrid也是从DepedencyObject派生的。
-
请注意您的 OnItemsPerPageChanged 回调是没有意义的。无需设置
ItemsPerPage = (Int32)e.NewValue;,因为它已经具有该值。回调旨在在属性值更改后执行操作。 -
是的,我知道还有一些额外的实现。但我正在尝试不同的选择来让它发挥作用。我将删除额外的工作。
标签: c# wpf data-binding dependency-properties