代码之家  ›  专栏  ›  技术社区  ›  maulik kansara

属性绑定到自定义控件中的依赖项属性不起作用

  •  0
  • maulik kansara  · 技术社区  · 6 年前

    我已经用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" . 然后它就开始工作了。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Access Denied    6 年前

    您需要将控件绑定到窗口的属性,如下所示:

    ItemsPerPage="{Binding Path=ipp,
                              RelativeSource={RelativeSource Mode=FindAncestor,
                                                             AncestorType=Window}}"
    

    int _ipp;
    public int ipp
    { 
       get=>_ipp;
       set{
            if (value!=_ipp)
            {
               _ipp=value;
               RaisePropertyChanged(nameof(ipp));
            }
       }
    }
    void RaisePropertyChanged(string propname)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propname));
    }
    
    
    public Window1()
    {
         ipp = 30;
         InitializeComponent();
    }
    
        2
  •  1
  •   Sir Rufo    6 年前

    主要问题是,您没有指定 DataContext 窗户的另一边。

    public partial class Window1 : Window
    {
        public int ipp { get; set; }
        public Window1()
        {
            ipp = 30;
            InitializeComponent();
            DataContext = this;
        }
    }