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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top