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}}"/>
Foi útil?

Solução

Tecnicamente, ele vai ficar bem, mas na prática eu não gosto dele:

  1. 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.

  2. 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.

  3. {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.

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