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?


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>

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.


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">


<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" />
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.