Como posso passar um valor constante para 1 ligação em multi-ligação?

97

Eu tenho uma multi-ligação como

<TextBlock>
    <TextBlock.Text>
        <MultiBinding Converter="{StaticResource myConverter}">
            <Binding Path="myFirst.Value" />
            <Binding Path="mySecond.Value" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

E eu quero passar um valor fixo, por exemplo, "123" para uma das duas ligações acima. Como posso fazer isso usando XAML?

Nam G VU
fonte
1
algum trecho de código / exemplo, por favor?
Torsten
Acho que falta alguma parte da pergunta. Você está se referindo à vinculação acima, mas não vejo nenhum código de vinculação na pergunta.
akjoshi
1
De alguma forma, toda vez que eu tenho uma pergunta, alguém fez exatamente a mesma pergunta anteriormente :) Ótimo!
Ignacio Soler Garcia
1
Uma quarta maneira de fazer isso seria usar esta resposta: stackoverflow.com/a/2552911/222134
Johny Skovdal

Respostas:

146

Se o seu valor for simplesmente a string, você pode especificá-lo como uma constante noSource propriedade de uma associação. Se for qualquer outro tipo de dado primitivo, você precisa definir um recurso estático e referenciá-lo.

Defina o sysnamespace na raiz do XAML para apontar Systemem mscorlib e o seguinte deve funcionar:

<TextBlock>
  <TextBlock.Resources>
    <sys:Int32 x:Key="fixedValue">123</sys:Int32>
  </TextBlock.Resources>
  <TextBlock.Text>
    <MultiBinding Converter="{StaticResource myConverter}">
      <Binding Path="myFirst.Value" />
      <Binding Source="{StaticResource fixedValue}" />
    </MultiBinding>
  </TextBlock.Text>
</TextBlock>
Noldorin
fonte
1
@tofutim Isso ocorre porque MultiBinding não parece ter recursos. Em vez disso, use TextBlock.Resources ...
Martin Hennings
6
Talvez você deva adicionar xmlns: sys = "clr-namespace: System; assembly = mscorlib" à sua solução ;-)
c0d3b34n
103

Ou, combinando as duas respostas acima:

<MultiBinding Converter="{StaticResource ScalingConverter}">
    <Binding>
        <Binding.Source>
            <sys:Double>0.5</sys:Double>
        </Binding.Source>
    </Binding>
    <Binding ElementName="TC" Path="ActualWidth" />
</MultiBinding>

Que fornece o tipo certo sem a confusão de recursos.

Anders Kaplan
fonte
1
É necessário definir o namespace sysno cabeçalho do documento:xmlns:sys="clr-namespace:System;assembly=mscorlib"
Beauty
25

Não entendi bem a pergunta, mas existem duas opções:

Colocar a linha <Binding Source="123" />em seu multibinding passará 123 como um valor vinculado ao seu conversor.

Coloque ConverterParameter="123"em seu MultiBinding:

<MultiBinding Converter="{StaticResource conv}" ConverterParameter="123">

benPearce
fonte
<Binding Source = "123" /> parece passar DependencyProperty.UnsetValue
Josh Stribling de
<Binding Source = "123" /> passa a string "123" em vez do número inteiro ou duplo que eu pretendia no meu caso.
Marcel Gosselin
Em IValueConverter, os parâmetros são passados ​​como object, o que significa que você precisaria converter o valor para o tipo correto, de maneira segura. IValueConverter.Convert
benPearce
4

Não estou dizendo que esta é uma resposta especialmente boa, mas aqui está outra abordagem:

<Binding Path="DoesNotExist" FallbackValue="123" />
David Hollinshead
fonte