Comment définir une propriété de dépendance sur une ressource statique?

j'essaie de contourner le fait que je ne peux pas spécifier une valeur dynamique pour ConverterParameter . Voir mon autre question pour savoir pourquoi je dois lier une valeur dynamique à ConverterParameter - Je n'aime pas les solutions actuellement publiées parce qu'elles exigent toutes ce que je pense devrait être des changements inutiles à mon modèle de vue.

pour tenter de résoudre cela, j'ai créé un convertisseur personnalisé, et exposé une propriété de dépendance sur ce convertisseur:

public class InstanceToBooleanConverter : DependencyObject, IValueConverter
{
    public object Value
    {
        get { return (object)GetValue(ValueProperty); }
        set { SetValue(ValueProperty, value); }
    }

    public static readonly DependencyProperty ValueProperty =
        DependencyProperty.Register("Value", typeof(object), typeof(InstanceToBooleanConverter), null);

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value != null && value.Equals(Value);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value.Equals(true) ? Value : Binding.DoNothing;
    }
}

y a-t-il un moyen de définir cette valeur en utilisant une reliure (ou un setter de style, ou une autre méthode folle) dans mon XAML?

<ItemsControl ItemsSource="{Binding Properties}">
    <ItemsControl.ItemTemplate>
        <DataTemplate DataType="{x:Type local:SomeClass}">
            <DataTemplate.Resources>
                <!-- I'd like to set Value to the item from ItemsSource -->
                <local:InstanceToBooleanConverter x:Key="converter" Value="{Binding Path=???}" />
            </DataTemplate.Resources>
<!- ... ->

les exemples que j'ai vus jusqu'à présent ne concernent que les ressources statiques.

Edit:

j'ai reçu quelques commentaires qu'il n'y a qu'une seule instance de convertisseur avec le XAML que j'ai posté.

je peux contourner cela en plaçant la ressource dans mon contrôle:

<ItemsControl ItemsSource="{Binding Properties}">
    <ItemsControl.ItemTemplate>
        <DataTemplate DataType="{x:Type local:SomeClass}">
            <RadioButton Content="{Binding Name}" GroupName="Properties">
                <RadioButton.Resources>
                    <!-- I'd like to set Value to the item from ItemsSource -->
                    <local:InstanceToBooleanConverter x:Key="converter"
                                                      Value="{Binding Path=???}" />
                </RadioButton.Resources>
                <RadioButton.IsChecked>
                    <Binding Path="DataContext.SelectedItem"
                             RelativeSource="{RelativeSource AncestorType={x:Type Window}}"
                             Converter="{StaticResource converter}" />
                </RadioButton.IsChecked>
            </RadioButton>
<!- ... ->

donc ce problème n'est pas bloqué en ayant à partager une instance du convertisseur:)

3
demandé sur Community 2011-05-05 23:59:49

2 réponses

malheureusement, cela ne va pas fonctionner - j'ai été sur cette route avant et il s'avère que tous les éléments dans le ItemsControl partagent le même Convertisseur. Je pense que cela est dû à la façon dont l'analyseur XAML fonctionne.

1
répondu default.kramer 2011-05-05 20:35:23

tout d'abord , vous pouvez spécifier le convertisseur à un dictionnaire de ressources de niveau supérieur et mettre x:Shared à false , deuxièmement si vous voulez " définir la valeur de L'élément de la source "comme vous annoté, vous pouvez juste spécifier une liaison vide ( Value="{Binding}" ).

0
répondu H.B. 2011-05-05 21:41:41