WPF: Uma maneira alternativa para especificar um ValueConverter na ligação
-
09-09-2019 - |
Pergunta
A maioria maneira comum que encontrei de especificar um conversor de valor para uma ligação é:
1. Crie uma instância do conversor de valor como um recurso com uma chave.
2. Referência a instância usando a extensão de marcação StaticResource:
<TextBlock Text="{Binding Converter={StaticResource myFormatter}" />
Q: Existe errado alguma coisa com o uso de instância estática como segue:
<TextBlock Text="{Binding Path=Description, Converter={x:Static local:MyFormatter.Instance}}"/>
// where Instance is declared as:
public readonly static MyFormatter Instance = new MyFormatter();
Na minha conversor de valor caso é imutável.
Editar: Outra maneira é para ligar o conversor para uma extensão de modo que você especifique o conversor usando o formato de extensão de marcação:
<TextBlock Text="{Binding Converter={local:MyFormatter}}"/>
Solução
Tecnicamente, ele vai ficar bem, mas na prática eu não gosto dele:
-
Se você declarar o conversor como um recurso, então você tem um único ponto de referência. Se você alterar o namespace ou classe nome do conversor, então você só tem um único local para atualização.
-
Se você declará-lo como estático, então você precisa para trazer o
clr-namespace
em no topo de cada arquivo XAML que usa o conversor. Se você declará-lo como um recurso, você não. -
{Binding Converter={StaticResource myFormatter}
é muito mais curto e mais fácil de ler do que o estático. No longo prazo, isso vai ajudá-lo mais do que você imagina.
Outras dicas
Enquanto o formatador realmente não tem estado, esta deve ser fino. Não é equivalente embora. No primeiro caso, você tem uma instância da classe para cada instância do seu controle baseado em XAML. No segundo, apenas uma instância nunca vai ser criado.