[.net] Quel devrait être le paramètre convertisseur pour cette liaison


Answers

Une autre méthode consiste à faire en sorte que votre convertisseur hérite de DependencyObject (ou FrameworkElement). Cela vous permet de déclarer les propriétés de dépendance, ce qui permet de définir ses valeurs à partir de XAML, même une liaison.

Exemple: Un convertisseur pour multiplier une valeur spécifiant le facteur, qui est obtenue à partir d'une propriété (FactorValue) dans un contrôle personnalisé (MyControl).

Le convertisseur:

public class MyConverter : DependencyObject, IValueConverter
{
    // The property used as a parameter
    public double Factor
    {
        get { return (double) GetValue(FactorProperty); }
        set { SetValue(FactorProperty, value); }
    }

    // The dependency property to allow the property to be used from XAML.
    public static readonly DependencyProperty FactorProperty =
        DependencyProperty.Register(
        "Factor",
        typeof(double),
        typeof(MyConverter),
        new PropertyMetadata(1.15d));

    #region IValueConverter Members

    object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        // Use the property in the Convert method instead of "parameter"
        return (double) value * Factor;
    }

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

    #endregion
}

Utiliser en XAML:

<MyConverter x:Key="MyConv"
             Factor={Binding ElementName=MyControl, Path=FactorValue}
/>

Ainsi, vous pouvez maintenant déclarer une propriété de dépendance pour chaque paramètre dont vous avez besoin dans votre convertisseur et le lier.

Question

J'essaye d'implémenter un contrôle d'utilisateur de wpf qui lie une zone de texte à une liste de doubles using un convertisseur. Comment puis-je définir l'instance du contrôle utilisateur comme paramètre du convertisseur?

le code du contrôle est indiqué ci-dessous

Merci

<UserControl x:Class="BaySizeControl.BaySizeTextBox"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
    xmlns:local="clr-namespace:BaySizeControl"
    >
    <UserControl.Resources>
        <local:BayListtoStringConverter x:Key="BaySizeConverter"/>
    </UserControl.Resources>
    <Grid>

        <TextBox  Name="Textbox_baysizes" 
                  Text="{Binding RelativeSource={RelativeSource self},
                                Path=Parent.Parent.BaySizeItemsSource, 
                                Converter={StaticResource BaySizeConverter}}"
                  />
    </Grid>
</UserControl>



J'ai eu le même problème, mais je ne peux pas utiliser MultiBindings car j'ai besoin d'implémenter correctement la méthode ConvertBack. Voici la solution que j'ai fini par implémenter pour la propriété IsChecked de CheckBox:

<CheckBox>
    <CheckBox.IsChecked>
        <Binding Converter="{StaticResource myConverter}" Path="Value">
            <Binding.ConverterParameter>
                <FrameworkElement DataContext="{TemplateBinding DataContext}" />
            </Binding.ConverterParameter>
        </Binding>
    </CheckBox.IsChecked>
</CheckBox>

Je ne suis pas très familier avec TemplateBindings (ou n'importe quoi WPF d'ailleurs), alors peut-être que cela ne fonctionne que parce que mon CheckBox est dans un DataTemplate ...