Comment puis-je transmettre une valeur constante pour 1 liaison en multi-liaison?

98

J'ai une multi-liaison comme

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

Et je veux passer une valeur fixe par exemple "123" à l'une des deux liaisons ci-dessus. Comment puis-je faire cela en utilisant XAML?

Nam G VU
la source
1
des extraits de code / exemples s'il vous plaît?
Torsten
Je pense qu'une partie de la question manque, vous faites référence à la liaison ci-dessus mais je ne vois aucun code de liaison dans la question.
akjoshi
1
D'une manière ou d'une autre, à chaque fois que j'ai une question, quelqu'un avait exactement la même question auparavant :) Super!
Ignacio Soler Garcia
1
Une quatrième façon de procéder serait d'utiliser cette réponse: stackoverflow.com/a/2552911/222134
Johny Skovdal

Réponses:

148

Si votre valeur est simplement a string, vous pouvez la spécifier comme constante dans la Sourcepropriété d'une liaison. S'il s'agit d'un autre type de données primitif, vous devez définir une ressource statique et la référencer.

Définissez l' sysespace de noms à la racine du XAML vers lequel pointer Systemdans mscorlib, et ce qui suit devrait fonctionner:

<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
la source
1
@tofutim C'est parce que MultiBinding ne semble pas avoir de ressources. Utilisez plutôt TextBlock.Resources ...
Martin Hennings
6
Vous devriez peut-être ajouter xmlns: sys = "clr-namespace: System; assembly = mscorlib" à votre solution ;-)
c0d3b34n
104

Ou, en combinant les deux réponses ci-dessus:

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

Qui fournit le bon type sans le kludge de ressources.

Anders Kaplan
la source
2
Il est nécessaire de définir l'espace sysde noms au niveau de la tête du document:xmlns:sys="clr-namespace:System;assembly=mscorlib"
Beauté
26

Je ne suis pas tout à fait la question mais il y a deux options:

Mettez la ligne <Binding Source="123" />dans votre multibinding passera 123 comme valeur liée à votre convertisseur.

Mettez ConverterParameter="123"dans votre MultiBinding:

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

benPearce
la source
<Binding Source = "123" /> semble passer DependencyProperty.UnsetValue
Josh Stribling
<Binding Source = "123" /> passe la chaîne "123" au lieu de l'entier ou du double que je voulais dans mon cas.
Marcel Gosselin
Dans IValueConverter, les paramètres sont transmis comme object, ce qui signifie que vous devez convertir la valeur dans le type correct, de manière sûre. IValueConverter.Convert
benPearce
6

Je ne dis pas que c'est une réponse particulièrement bonne, mais voici une autre approche:

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