可绑定属性的setter永远不会触发

时间:2017-04-10 09:11:05

标签: c# wpf data-binding xamarin.forms

我为Label创建了一个自定义渲染器。现在我想用它的焦点状态进行操作,所以我创建了可绑定的属性和事件。当我从自定义渲染器更改可绑定属性时,它工作正常,如下所示:Element.IsFocused = true; 但是当我从视图模型中更改它时,它会影响XAML视图,但由于某些原因,不会为此属性调用setter。这是代码:

在自定义类中:

 public new static readonly BindableProperty IsFocusedProperty =
           BindableProperty.Create(nameof(IsFocused), typeof(bool), typeof(FloatingEntry), false);

        public new bool IsFocused
        {
            get { return (bool)GetValue(IsFocusedProperty); }
            set
            {
                SetValue(IsFocusedProperty, value);
                if (value) Focus();
            }
        }  

在XAML中:

IsFocused="{Binding PasswordEntryIsFocused}"

在视图模型中:

 private bool _passwordEntryIsFocused;
         public bool PasswordEntryIsFocused
            {
                get { return _passwordEntryIsFocused; }
                set
                {
                    SetProperty(ref _passwordEntryIsFocused, value);
                }
            }

在View模型中使用某种方法:PasswordEntryIsFocused = true;

它不是关于new关键字,我试过没有它。 绑定工作,因为我试图将它与视觉属性绑定,如IsVisible,它的工作方式应该如此,但是setter总是只能从自定义渲染器调用。

我想我可能会在可绑定属性工作的上下文中遗漏一些东西。

1 个答案:

答案 0 :(得分:5)

  

但是当我从视图模型中更改它时,它会影响XAML视图,但由于某些原因,不会为此属性调用setter。

是的,这是WPF常见的错误。 XAML生成的代码不会调用setter,而是立即更改绑定的依赖项属性。除非您附加PropertyChangedCallback事件,否则您无法中断此活动。