Question

Je souhaite ajouter une valeur constante à un entier lié entrant. En fait, il y a plusieurs endroits où je veux me lier à la même valeur source mais ajouter différentes constantes. Donc, la solution idéale serait quelque chose comme ça ...

<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myInt, Constant=5}"/>
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myInt, Constant=8}"/>
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myInt, Constant=24}"/>

(NOTE: Ceci est un exemple pour montrer l'idée. Mon scénario de liaison actuel ne concerne pas la propriété canvas d'une zone de texte. Mais cela montre l'idée plus clairement.)

Pour le moment, la seule solution à laquelle je puisse penser est d'exposer de nombreuses propriétés de source différentes, chacune d'entre elles ajoutant une constante différente à la même valeur interne. Donc, je pourrais faire quelque chose comme ça ...

<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myIntPlus5}"/>
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myIntPlus8}"/>
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myIntPlus24}"/>

Mais c’est plutôt sinistre, car j’aurai peut-être besoin de continuer à ajouter de nouvelles propriétés pour de nouvelles constantes. Aussi, si j'ai besoin de changer la valeur ajoutée, il faut que je modifie l'objet source, ce qui est plutôt stupide.

Il doit y avoir un moyen plus générique que cela? Des experts de WPF ont-ils des idées?

Était-ce utile?

La solution

Je pense que vous pouvez le faire avec un convertisseur de valeur. Voici un entrée de blog permettant de transmettre un paramètre au convertisseur de valeur dans le fichier xaml. Et ce blog donne des détails sur la mise en œuvre d'un convertisseur de valeur. .

Autres conseils

J'utilise un MathConverter que j'ai créé pour effectuer toutes les opérations arithmatiques simples. Le code du convertisseur est ici et peut être utilisé. comme ceci:

<TextBox Canvas.Top="{Binding SomeValue, 
             Converter={StaticResource MathConverter},
             ConverterParameter=@VALUE+5}" />

Vous pouvez même l'utiliser avec des opérations arithmatiques plus avancées telles que

Width="{Binding ElementName=RootWindow, Path=ActualWidth,
                Converter={StaticResource MathConverter},
                ConverterParameter=((@VALUE-200)*.3)}"

L'utilisation d'un convertisseur de valeur est une bonne solution au problème car elle vous permet de modifier la valeur source car elle est liée à l'interface utilisateur.

J'ai utilisé les éléments suivants dans plusieurs endroits.

public class AddValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        object result = value;
        int parameterValue;

        if (value != null && targetType == typeof(Int32) && 
            int.TryParse((string)parameter, 
            NumberStyles.Integer, culture, out parameterValue))
        {
            result = (int)value + (int)parameterValue;
        }

        return result;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Exemple     

 <Setter Property="Grid.ColumnSpan"
         Value="{Binding 
                   Path=ColumnDefinitions.Count,
                   RelativeSource={RelativeSource AncestorType=Grid},
                   Converter={StaticResource addValueConverter},
                   ConverterParameter=1}"
  />

Je n'ai jamais utilisé WPF, mais j'ai une solution possible.

Votre chemin de liaison peut-il mapper sur une carte? Si c'est le cas, il devrait alors être capable de prendre un argument (la clé). Vous devez créer une classe qui implémente l'interface Map, mais ne renvoie en réalité que la valeur de base à laquelle vous avez initialisé le " Map " avec ajouté à la clé.

public Integer get( Integer key ) { return baseInt + key; }  // or some such

Sans une certaine possibilité de passer le numéro de la balise, je ne vois pas comment vous allez le faire renvoyer des deltas différents de la valeur d'origine.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top