Como alterar dinamicamente ConverterParameter (ou qualquer) propriedade de um MultiBinding (ou qualquer outro) de recursos em tempo de execução?

StackOverflow https://stackoverflow.com/questions/1272049

Pergunta

Eu sou novo para WPF e XAML. i encontrar soluções da maioria dos problemas (em outras línguas), pesquisando aqui n lá ou pesquisando em torno mas este me fez louco. i pesquisado muito no google e ler muitos fóruns, mas parece que desta vez eu reuniu-se com um verdadeiro desafio!

Eu tenho seguinte código no Window.Resources:

<my:NameConverter x:Key="NameConverter"/>

<MultiBinding x:Key="CustomerFullNameBinding" 
              Converter="{StaticResource NameConverter}"
              ConverterParameter="LastNameFirst">
     <Binding Path="FirstName"  />
     <Binding Path="MiddleName" />
     <Binding Path="LastName" />
</MultiBinding>

O NameConverter classe retorna nome completo através da combinação de partes individuais do nome. O valor de retorno é baseado no valor de ConverterParameter que pode ser um dos seguintes: FirstNameFirst, LastNameFirst, OnlyFirstName, OnlyLastName, Iniciais (há um pouco mais, mas por simplicidade , não vamos considerá-los)

Este código funciona bem. Eu uso a seguir para obter o resultado:

<TextBlock Text="{DynamicResource CustomerFullNameBinding}"/>

No entanto, o problema é que se eu usar o recurso CustomerFullNameBinding 20 vezes no meu código (como mostrado abovw) todos eles iria mostrar o nome em um formato particular. (Ou seja, aqui na declaração de CustomerFullNameBinding eu tenho set ConverterParameter = "LastNameFirst" para que todos os 20 referências irá mostrar o nome em apenas dessa forma.)

Agora a minha pergunta é que eu posso torná-lo mais "generalizada" de modo que o que eu posso definir o valor do ConverterParameter dinamicamente? ou seja, i pode ter vários TextBlocks que podem exibir nome completo em formatos diferentes. Eu sei que é possível se criar vários recursos como segue:

 <MultiBinding x:Key="CustomerFullNameBinding_FirstNameFirst" 
               Converter="..." ConverterParameter="FirstNameFirst">
      ......
 </MultiBinding>
 <MultiBinding x:Key="CustomerFullNameBinding_LastNameFirst" 
               Converter="..." ConverterParameter="LastNameFirst">
      ......
 </MultiBinding>
 <MultiBinding x:Key="CustomerFullNameBinding_OnlyFirstName" 
               Converter="..." ConverterParameter="OnlyFirstName">
      ......
 </MultiBinding>

 ... and so on ...

Mas eu não quero isso ', coz ele vai realmente fazer o meu código demasiado volumoso, e mais importante que vai anular conceito de reutilização de recursos!

Por favor me sugerir qualquer solução possível.
Agradecemos antecipadamente.

Nota: eu tive a idéia original do aqui . O exemplo de trabalho semelhante pode ser encontrada msdn.microsoft.com/en-us/library/ms771336.aspx.

Tags: wpf xaml StaticResource DynamicResource ligação

Foi útil?

Solução

Para ser capaz de alterar o modo de exibição usado em cada caso, eu acho que eu teria feito algo como isto:

  • Criar um UserControl com 3 TextBlocks para exibir as 3 partes do nome.
  • Adicione propriedades ao acima para as partes do nome a ser alvos de ligação.
  • Adicionar uma propriedade para o modo no qual a exibição ( FirstNameFirst , LastNameFirst , etc.)

O acima requer uma ligação para cada uma das peças do nome, então uma maneira de simplificar o que seria fazer uma única propriedade na UserControl de um tipo NameData declarada como uma estrutura com propriedades First, Middle e Last. Em seguida, você ainda pode usar um único MultiBinding a essa propriedade. A diferença seria que o seu NameConverter tomaria as 3 peças e retornar uma nova struct NameData em vez de uma string formatada.

<NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="LastNameFirst" />

<NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="FirstNameFirst" />

<NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="Initials" />

<!-- and so on... -->

A idéia é dissociar a formatação dos dados.

A parte que tropeçou coisas estava declarando um MultiBinding como um recurso. Normalmente, haveria uma MultiBinding em cada TextBlock você está ligando para de modo que você pode mudar o ConverterParameter para cada caso.

Editar: Eu sei que você queria ser capaz de mudar ConverterParameter, mas isso não é realmente possível devido à 1 instância de MultiBinding e ConverterParameter sendo uma propriedade simples em vez de um DependencyProperty, que seria necessário a ser alvo de um DynamicResource ou Binding.

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