9 votes

Erreur lors de la liaison utilisant des extensions de balisage : Unknown property encountered while parsing a Markup Extension (propriété inconnue rencontrée lors de l'analyse d'une extension)

En principe, j'ai développé un moyen astucieux de lier les RadioButtons à presque n'importe quoi :

/// <summary>Converts an value to 'true' if it matches the 'To' property.</summary>
/// <example>
/// <RadioButton IsChecked="{Binding VersionString, Converter={local:TrueWhenEqual To='1.0'}}"/>
/// </example>
public class TrueWhenEqual : MarkupExtension, IValueConverter
{
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }

    public object To { get; set; }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return object.Equals(value, To);
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if ((bool)value) return To;
        throw new NotSupportedException();
    }
}

Par exemple, vous pouvez l'utiliser pour lier des boutons radio à une propriété de type chaîne de caractères comme suit (il s'agit d'un bogue bien connu selon lequel vous devez utiliser un nom de groupe unique pour chaque bouton radio) :

<RadioButton GroupName="G1" Content="Cat"
    IsChecked="{Binding Animal, Converter={local:TrueWhenEqual To='CAT'}}"/>
<RadioButton GroupName="G2" Content="Dog"
    IsChecked="{Binding Animal, Converter={local:TrueWhenEqual To='DOG'}}"/>
<RadioButton GroupName="G3" Content="Horse"
    IsChecked="{Binding Animal, Converter={local:TrueWhenEqual To='HORSE'}}"/>

Maintenant, je voudrais utiliser public static readonly objets appelés Filter1 y Filter2 comme valeurs de mes RadioButtons. J'ai donc essayé :

<RadioButton GroupName="F1" Content="Filter Number One"
    IsChecked="{Binding Filter, Converter={local:TrueWhenEqual To='{x:Static local:ViewModelClass.Filter1}'}}"/>
<RadioButton GroupName="F2" Content="Filter Number Two"
    IsChecked="{Binding Filter, Converter={local:TrueWhenEqual To='{x:Static local:ViewModelClass.Filter2}'}}"/>

Mais cela me donne une erreur :

Propriété inconnue 'To' pour le type 'MS.Internal.Markup.MarkupExtensionParser+UnknownMarkupExtension' rencontrée lors de l'analyse d'une Markup Extension.

L'erreur se produit toujours si je supprime les guillemets. Qu'est-ce qui ne va pas ?

9voto

colinsmith Points 7084

Il s'agit d'un bogue qui peut se produire avec des MarkupExtensions imbriquées. Essayez de placer votre balisage personnalisé dans une DLL/un projet distinct ou utilisez la syntaxe des éléments de propriété.

6voto

Adi Lester Points 10814

WPF ne gère pas très bien les extensions de balisage imbriquées. Pour y remédier, vous pouvez utiliser votre extension de balisage comme un élément. C'est un peu maladroit et plus difficile à lire, mais cela fonctionne :

<RadioButton GroupName="F1" Content="Filter Number One">
    <RadioButton.IsChecked>
        <Binding Path="Filter">
            <Binding.Converter>
                <local:TrueWhenEqual To={x:Static local:ViewModelClass.Filter1} />
            </Binding.Converter>
        </Binding>
    </RadioButton.IsChecked>
</RadioButton>

Une autre solution consiste à déclarer votre convertisseur et à l'utiliser comme une ressource statique :

<Window.Resources>
    <local:TrueWhenEqual To={x:Static local:ViewModelClass.Filter1} x:Key="myConverter" />
</Window.Resources>

<RadioButton GroupName="F1" Content="Filter Number One"
             IsChecked="{Binding Filter, Converter={StaticResource myConverter}}" />

0voto

scor4er Points 77

J'ai rencontré le même problème sur une machine avec .NET 4.6 installé. Dès que j'ai mis à jour vers .NET 4.7 (Developer Pack), cette erreur a disparu sans aucune modification du code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X