我已经用dependencProperty创建了一个名为ItemsPerPage的自定义控件。我在窗口中使用了那个自定义控件。现在,如果我将值直接赋给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"
. 然后它就开始工作了。