我为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总是只能从自定义渲染器调用。
我想我可能会在可绑定属性工作的上下文中遗漏一些东西。
答案 0 :(得分:5)
但是当我从视图模型中更改它时,它会影响XAML视图,但由于某些原因,不会为此属性调用setter。
是的,这是WPF常见的错误。 XAML生成的代码不会调用setter,而是立即更改绑定的依赖项属性。除非您附加PropertyChangedCallback
事件,否则您无法中断此活动。