Pergunta

Eu quero adicionar um valor constante para um inteiro limite de entrada. Na verdade eu tenho vários lugares onde eu deseja ligar para o mesmo valor de origem, mas agregam diferentes constantes. Portanto, a solução ideal seria algo como isto ...

<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: Este é um exemplo para mostrar a idéia, meu cenário de ligação real não é a propriedade da lona de um TextBox Mas isso mostra a idéia de forma mais clara.)

No momento, a única solução que eu posso pensar é expor muitas propriedades de origem diferentes cada um dos quais acrescenta uma constante diferente para o mesmo valor interno. Então eu poderia fazer algo assim ...

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

Mas isso é muito triste porque no futuro eu poderia precisar para continuar a acrescentar novas propriedades para novas constantes. Além disso, se eu precisar alterar o valor acrescentado eu preciso ir um alterar o objeto de origem que é muito bobo.

Deve haver uma maneira mais genérica do que isso? Os peritos WPF tem alguma idéia?

Foi útil?

Solução

Eu acredito que você pode fazer isso com um conversor de valor. Aqui é um blog que os endereços passando um parâmetro para o conversor de valor no XAML. E neste blog dá alguns detalhes de implementação de um conversor de valor .

Outras dicas

Eu uso um MathConverterthat eu criei para fazer todas as operações arithmatic simples com. O código para o conversor é aqui e ele pode ser usado assim:

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

Você pode até usá-lo com operações arithmatic mais avançadas, como

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

Usando um conversor de valor é uma boa solução para o problema, uma vez que permite que você modifique o valor de origem como está sendo vinculado à UI.

Eu usei o seguinte em um par de lugares.

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

Exemplo

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

Eu nunca usei WPF, mas eu tenho uma solução possível.

Can seu mapa caminho de ligação a um mapa? Se assim for, deve, então, ser capaz de tomar um argumento (a chave). Você precisaria criar uma classe que implementa a interface Map, mas realmente apenas retorna o valor de base que você inicializado o "Mapa" com adicionado à chave.

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

Sem alguma capacidade de passar o número do tag, eu não vejo como você está indo para obtê-lo para retornar diferentes deltas do valor original.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top