Propriedades de dependência personalizadas e ligação de Twoway no WPF
-
03-07-2019 - |
Pergunta
Temos um objeto que deriva do dependencyObject e implementa algumas redatórios de dependência.
Basicamente algo assim:
class Context : DependencyObject {
public static readonly DependencyProperty NameProperty =
DependencyProperty.Register ("Name", typeof (string), typeof (Context), new PropertyMetadata (""));
public string Name {
get {
return (string)this.GetValue (NameProperty);
}
set {
this.SetValue (NameProperty, value);
}
}
}
Isso funciona, a propriedade é configurada, pode ser vinculada, etc. O problema ocorre quando eu vincula a propriedade do WPF, usando um bind twoway. A parte twoway nunca acontece, o WPF nunca chama o conjunto dessa propriedade. Eu configurei minha encadernação assim:
<TextBox Text="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
Nesse caso, digitar na caixa de texto deve atualizar imediatamente a propriedade Name, mas não. Se eu alterar a propriedade Name para ser uma propriedade POCO regular, ela funciona (embora o outro lado do Twoway obviamente não o faça, a menos que eu implemente o InotifyPropertyChanged).
O que eu estou fazendo errado aqui? Isso deve ser uma coisa realmente simples de se fazer, mas não está me causando dores de cabeça.
Solução
Este é o comportamento esperado. A propriedade CLR é apenas um invólucro em torno do subjacente DependencyProperty
. O WPF costuma otimizar ligando GetValue
e SetValue
diretamente. Se você precisar de lógica personalizada para executar, use os metadados do DependencyProperty
.
Outras dicas
Depois desta edição, me custou algum tempo:
Para aqueles que têm o mesmo problema, mas - como eu - não vejam a solução na resposta acima:
Para apoiar a herança do datacontext, a classe personalizada (contexto neste caso) deve ser derivada de FrameworkElement ao invés de DependencyObject. Isso é tudo.
Marc