Domanda

Voglio aggiungere un valore costante su un numero intero associato in entrata. In effetti ho diversi posti in cui voglio legare allo stesso valore sorgente ma aggiungere costanti diverse. Quindi la soluzione ideale sarebbe qualcosa di simile ...

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

(NOTA: questo è un esempio per mostrare l'idea, il mio attuale scenario di associazione non è la proprietà canvas di un TextBox. Ma questo mostra l'idea più chiaramente)

Al momento l'unica soluzione a cui riesco a pensare è quella di esporre molte proprietà sorgente diverse ognuna delle quali aggiunge una costante diversa allo stesso valore interno. Quindi potrei fare qualcosa del genere ...

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

Ma questo è piuttosto triste perché in futuro potrei aver bisogno di continuare ad aggiungere nuove proprietà per nuove costanti. Inoltre, se devo modificare il valore aggiunto, devo modificare l'oggetto sorgente, che è piuttosto naff.

Deve esserci un modo più generico di questo? Qualche esperto del WPF ha qualche idea?

È stato utile?

Soluzione

Credo che tu possa farlo con un convertitore di valore. Ecco un post di blog che indirizza il passaggio di un parametro al convertitore di valori in xaml. E questo blog fornisce alcuni dettagli sull'implementazione di un convertitore di valore .

Altri suggerimenti

Uso un MathConverter che ho creato per eseguire tutte le semplici operazioni aritmiche. Il codice per il convertitore è qui e può essere utilizzato in questo modo:

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

Puoi persino usarlo con operazioni aritmiche più avanzate come

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

L'uso di un convertitore di valore è una buona soluzione al problema in quanto consente di modificare il valore di origine in quanto associato all'interfaccia utente.

Ho usato il seguente in un paio di posti.

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();
    }
}

Esempio     

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

Non ho mai usato WPF, ma ho una possibile soluzione.

Il tuo percorso vincolante può essere mappato su una mappa? In tal caso, dovrebbe essere in grado di accettare un argomento (la chiave). Dovresti creare una classe che implementa l'interfaccia Mappa, ma in realtà restituisce solo il valore di base che hai inizializzato " Mappa " con aggiunta alla chiave.

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

Senza alcuna possibilità di passare il numero dal tag, non vedo come lo otterrai per restituire delta diversi dal valore originale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top