Como alterar dinamicamente ConverterParameter (ou qualquer) propriedade de um MultiBinding (ou qualquer outro) de recursos em tempo de execução?
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
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 3TextBlock
s 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
.