Sök…


parametrar

Parameter detaljer
värde Värdet som produceras av bindningskällan.
värden Värden array, producerad av bindningskällan.
targetType Typen för den bindande målegenskapen.
parameter Omvandlarparametern som ska användas.
kultur Den kultur som ska användas i omvandlaren.

Anmärkningar

Vad IValueConverter och IMultiValueConverter är

IValueConverter och IMultiValueConverter - gränssnitt som ger ett sätt att tillämpa en anpassad logik på en bindning.

Vad de är användbara för

  1. Du har ett viss typvärde men du vill visa nollvärden på ett sätt och positiva siffror på ett annat sätt
  2. Du har ett värde av något slag och vill visa element i ett fall och gömma sig i ett annat
  3. Du har ett numeriskt värde på pengar men vill visa det som ord
  4. Du har ett numeriskt värde men vill visa olika bilder för defferenta nummer

Detta är några av de enkla fallen, men det finns många fler.

I fall som detta kan du använda en värdekonverterare. Dessa små klasser, som implementerar IValueConverter-gränssnittet eller IMultiValueConverter, kommer att fungera som mellanhänder och översätta ett värde mellan källan och destinationen. Så i alla situationer där du behöver omvandla ett värde innan det når sin destination eller tillbaka till källan igen, behöver du troligen en omvandlare.

Inbyggt BooleanToVisibilityConverter [IValueConverter]

Konverterare mellan booleska och synlighet. Få bool på ingången och returnerar Visibility .

OBS: Den här konverteraren finns redan i System.Windows.Controls namnutrymme.

public sealed class BooleanToVisibilityConverter : IValueConverter
{
    /// <summary>
    /// Convert bool or Nullable bool to Visibility
    /// </summary>
    /// <param name="value">bool or Nullable bool</param>
    /// <param name="targetType">Visibility</param>
    /// <param name="parameter">null</param>
    /// <param name="culture">null</param>
    /// <returns>Visible or Collapsed</returns>
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool bValue = false;
        if (value is bool)
        {
            bValue = (bool)value;
        }
        else if (value is Nullable<bool>)
        {
            Nullable<bool> tmp = (Nullable<bool>)value;
            bValue = tmp.HasValue ? tmp.Value : false;
        }
        return (bValue) ? Visibility.Visible : Visibility.Collapsed;
    }

    /// <summary>
    /// Convert Visibility to boolean
    /// </summary>
    /// <param name="value"></param>
    /// <param name="targetType"></param>
    /// <param name="parameter"></param>
    /// <param name="culture"></param>
    /// <returns></returns>
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is Visibility)
        {
            return (Visibility)value == Visibility.Visible;
        }
        else
        {
            return false;
        }
    }
}

Använda omvandlaren

  1. Definiera resurs
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
  1. Använd den bindande
<Button Visibility="{Binding AllowEditing, 
                             Converter={StaticResource BooleanToVisibilityConverter}}"/>

Konverterare med fastighet [IValueConverter]

Visa hur man skapar en enkel omvandlare med parameter via egenskap och sedan skicka den i deklaration. Konvertera bool till Visibility . Tillåt inverterat resultatvärde genom att ställa Inverted egenskap till True .

public class BooleanToVisibilityConverter : IValueConverter
{
    public bool Inverted { get; set; }

    /// <summary>
    /// Convert bool or Nullable bool to Visibility
    /// </summary>
    /// <param name="value">bool or Nullable bool</param>
    /// <param name="targetType">Visibility</param>
    /// <param name="parameter">null</param>
    /// <param name="culture">null</param>
    /// <returns>Visible or Collapsed</returns>
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool bValue = false;
        if (value is bool)
        {
            bValue = (bool)value;
        }
        else if (value is Nullable<bool>)
        {
            Nullable<bool> tmp = (Nullable<bool>)value;
            bValue = tmp ?? false;
        }

        if (Inverted)
            bValue = !bValue;
        return (bValue) ? Visibility.Visible : Visibility.Collapsed;
    }

    /// <summary>
    /// Convert Visibility to boolean
    /// </summary>
    /// <param name="value"></param>
    /// <param name="targetType"></param>
    /// <param name="parameter"></param>
    /// <param name="culture"></param>
    /// <returns>True or False</returns>
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is Visibility)
        {
            return ((Visibility) value == Visibility.Visible) && !Inverted;
        }

        return false;
    }
}

Använda omvandlaren

  1. Definiera namnutrymmet

xmlns:converters="clr-namespace:MyProject.Converters;assembly=MyProject"

  1. Definiera resurs
<converters:BooleanToVisibilityConverter x:Key="BoolToVisibilityInvertedConverter"
                                         Inverted="False"/>
  1. Använd den bindande
<Button Visibility="{Binding AllowEditing, Converter={StaticResource BoolToVisibilityConverter}}"/>

Enkel tilläggskonverterare [IMultiValueConverter]

Visa hur man skapar enkel IMultiValueConverter omvandlare och använder MultiBinding i xaml. Få sammanfattning av alla värden som passeras av values array.

public class AddConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        decimal sum = 0M;

        foreach (string value in values)
        {
            decimal parseResult;
            if (decimal.TryParse(value, out parseResult))
            {
                sum += parseResult;
            }
        }

        return sum.ToString(culture);
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

Använda omvandlaren

  1. Definiera namnutrymmet
xmlns:converters="clr-namespace:MyProject.Converters;assembly=MyProject"
  1. Definiera resurs
<converters:AddConverter x:Key="AddConverter"/>
  1. Använd den bindande
<StackPanel Orientation="Vertical">
    <TextBox x:Name="TextBox" />
    <TextBox x:Name="TextBox1" />
    <TextBlock >
        <TextBlock.Text>
            <MultiBinding Converter="{StaticResource AddConverter}">
                <Binding Path="Text" ElementName="TextBox"/>
                <Binding Path="Text" ElementName="TextBox1"/>
            </MultiBinding>
         </TextBlock.Text>
    </TextBlock>
</StackPanel>

Användningsomvandlare med ConverterParameter

Visa hur du skapar enkel omvandlare och använd ConverterParameter att skicka parameter till omvandlare. Multiplicera värde med koefficient som skickas i ConverterParameter.

public class MultiplyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
            return 0;

        if (parameter == null)
            parameter = 1;

        double number;
        double coefficient;

        if (double.TryParse(value.ToString(), out number) && double.TryParse(parameter.ToString(), out coefficient))
        {
            return number * coefficient;
        }

        return 0;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

Använda omvandlaren

  1. Definiera namnutrymmet
xmlns:converters="clr-namespace:MyProject.Converters;assembly=MyProject"
  1. Definiera resurs
<converters:MultiplyConverter x:Key="MultiplyConverter"/>
  1. Använd den bindande
<StackPanel Orientation="Vertical">
    <TextBox x:Name="TextBox" />
    <TextBlock Text="{Binding Path=Text, 
                              ElementName=TextBox, 
                              Converter={StaticResource MultiplyConverter},
                              ConverterParameter=10}"/>
</StackPanel>

Gruppera flera omvandlare [IValueConverter]

Denna omvandlare kommer att kedja flera omvandlare tillsammans.

public class ValueConverterGroup : List<IValueConverter>, IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return this.Aggregate(value, (current, converter) => converter.Convert(current, targetType, parameter, culture));
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

I det här exemplet används det booleska resultatet från EnumToBooleanConverter som inmatning i BooleanToVisibilityConverter .

<local:ValueConverterGroup x:Key="EnumToVisibilityConverter">
    <local:EnumToBooleanConverter/>
    <local:BooleanToVisibilityConverter/>
</local:ValueConverterGroup>

Knappen kommer endast att synas när egenskapen CurrentMode är inställd på Ready .

<Button Content="Ok" Visibility="{Binding Path=CurrentMode, Converter={StaticResource EnumToVisibilityConverter}, ConverterParameter={x:Static local:Mode.Ready}"/>

Använd MarkupExtension med omvandlare för att hoppa över resursdeklarationen

För att använda konverteraren måste vi vanligtvis definiera den som resurs på följande sätt:

<converters:SomeConverter x:Key="SomeConverter"/>

Det är möjligt att hoppa över detta steg genom att definiera en omvandlare som MarkupExtension och implementera metoden ProvideValue . Följande exempel konverterar ett värde till det negativa:

namespace MyProject.Converters
{
public class Converter_Negative : MarkupExtension, IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return this.ReturnNegative(value);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return this.ReturnNegative(value);
    }

    private object ReturnNegative(object value)
    {
        object result = null;
        var @switch = new Dictionary<Type, Action> {
            { typeof(bool), () => result=!(bool)value },
            { typeof(byte), () => result=-1*(byte)value },
            { typeof(short), () => result=-1*(short)value },
            { typeof(int), () => result=-1*(int)value },
            { typeof(long), () => result=-1*(long)value },
            { typeof(float), () => result=-1f*(float)value },
            { typeof(double), () => result=-1d*(double)value },
            { typeof(decimal), () => result=-1m*(decimal)value }
        };

        @switch[value.GetType()]();
        if (result == null) throw new NotImplementedException();
        return result;
    }

    public Converter_Negative()
        : base()
    {
    }

    private static Converter_Negative _converter = null;

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        if (_converter == null) _converter = new Converter_Negative();
        return _converter;
    }
}
}

Använda omvandlaren:

  1. Definiera namnutrymmet

    xmlns: omvandlare = "clr-namespace: MyProject.Converters; aggregatet = MyProject"

  2. Exempel på användning av denna omvandlare i bindning

    <RichTextBox IsReadOnly="{Binding Path=IsChecked, ElementName=toggleIsEnabled, Converter={converters:Converter_Negative}}"/>
    

Använd IMultiValueConverter för att skicka flera parametrar till en kommando

Det är möjligt att överföra flera bundna värden som en CommandParameter med MultiBinding med en mycket enkel IMultiValueConverter :

namespace MyProject.Converters
{
    public class Converter_MultipleCommandParameters : MarkupExtension, IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            return values.ToArray();
        }
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotSupportedException();
        }

        private static Converter_MultipleCommandParameters _converter = null;

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            if (_converter == null) _converter = new Converter_MultipleCommandParameters();
            return _converter;
        }

        public Converter_MultipleCommandParameters()
            : base()
        {
        }
    }
}

Använda omvandlaren:

  1. Exempelimplementering - metod som kallas när SomeCommand körs ( Obs: DelegateCommand är en implementering av ICommand som inte finns i detta exempel ):

     private ICommand _SomeCommand;
     public ICommand SomeCommand
     {
         get { return _SomeCommand ?? (_SomeCommand = new DelegateCommand(a => OnSomeCommand(a))); }
     }
    
     private void OnSomeCommand(object item)
     {
         object[] parameters = item as object[];
    
         MessageBox.Show(
             string.Format("Execute command: {0}\nParameter 1: {1}\nParamter 2: {2}\nParamter 3: {3}",
             "SomeCommand", parameters[0], parameters[1], parameters[2]));
     }
    
  2. Definiera namnutrymmet

xmlns: omvandlare = "clr-namespace: MyProject.Converters; aggregatet = MyProject"

  1. Exempel på användning av denna omvandlare i bindning

    <Button Width="150" Height="23" Content="Execute some command" Name="btnTestSomeCommand"
         Command="{Binding Path=SomeCommand}" >
         <Button.CommandParameter>
             <MultiBinding Converter="{converters:Converter_MultipleCommandParameters}">
                 <Binding RelativeSource="{RelativeSource Self}" Path="IsFocused"/>
                 <Binding RelativeSource="{RelativeSource Self}" Path="Name"/>
                 <Binding RelativeSource="{RelativeSource Self}" Path="ActualWidth"/>
             </MultiBinding>
         </Button.CommandParameter>
     </Button>
    


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow