Convertisseur avec des Propriétés de Dépendance

J'ai des problèmes de mise en œuvre personnalisée DependencyObject:

J'ai besoin d'un convertisseur qui définit ou unsets un enum drapeau dans une propriété liée. Donc j'ai créé un IValueConverter derieved de FrameworkElement avec deux DependencyProperties: Flag (drapeau qui est de définir/annuler par le convertisseur) et indicateurs (la valeur de la propriété à modifier). Le parent UserControl (Nom = EnumerationEditor) fournit à la propriété à laquelle le convertisseur est lié.

Une ListBox génère des Cases à cocher et le convertisseur instances qui sont utilisés pour modifier la propriété par l'intermédiaire d'un DataTemplate. Chaque Case à cocher/convertisseur exemple, est utilisé pour un seul drapeau. J'utilise le code XAML suivant:

<ListBox Name="Values" SelectionMode="Extended" BorderThickness="1" BorderBrush="Black" Padding="5">
    <ListBox.ItemTemplate>
        <DataTemplate DataType="{x:Type system:Enum}">

            <DataTemplate.Resources>
                <Label x:Key="myTestResource" x:Shared="False"
                            Content="{Binding}"
                            ToolTip="{Binding Path=Value, ElementName=EnumerationEditor}"
                            Foreground="{Binding Path=Background, ElementName=EnumerationEditor}"
                            Background="{Binding Path=Foreground, ElementName=EnumerationEditor}"/>
                <converters:EnumerationConverter x:Key="EnumerationConverter" x:Shared="False"
                                                    Flag="{Binding}"
                                                    Flags="{Binding Path=Value, ElementName=EnumerationEditor}"/>
            </DataTemplate.Resources>

            <StackPanel Orientation="Horizontal">
                <CheckBox Content="{Binding}" IsChecked="{Binding Path=Value, ElementName=EnumerationEditor, Converter={StaticResource EnumerationConverter}}"/>
                <ContentPresenter Content="{StaticResource myTestResource}"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

La chose étrange: Le Label fonctionne très bien - mais le convertisseur ne fonctionne pas. J'obtiens l'erreur:

Système.De Windows.Erreur de données: 4 : Impossible de trouver la source pour la liaison avec la référence "ElementName=EnumerationEditor'. BindingExpression:Path=Valeur; DataItem=null; élément cible est "EnumerationConverter' (Name="); la propriété cible est "Drapeaux" (type "Enum')

Je ne comprends pas pourquoi, la liaison est fondamentalement la même chose...

Voici le code pour le convertisseur:

public class EnumerationConverter : FrameworkElement, IValueConverter
{

    #region IValueConverter

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return false;
    }

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

    #endregion

    #region public Enum Flag { get; set; }

    public Enum Flag
    {
        get { return (Enum)this.GetValue(EnumerationConverter.FlagProperty); }
        set { this.SetValue(EnumerationConverter.FlagProperty, value); }
    }

    ///<summary>
    ///Dependency property for Flag.
    ///</summary>
    public static readonly DependencyProperty FlagProperty = DependencyProperty.Register("Flag", typeof(Enum), typeof(EnumerationConverter));

    #endregion

    #region public Enum Flags { get; set; }

    public Enum Flags
    {
        get { return (Enum)this.GetValue(EnumerationConverter.FlagsProperty); }
        set { this.SetValue(EnumerationConverter.FlagsProperty, value); }
    }

    ///<summary>
    ///Dependency property for Flags.
    ///</summary>
    public static readonly DependencyProperty FlagsProperty = DependencyProperty.Register("Flags", typeof(Enum), typeof(EnumerationConverter));

    #endregion

}
  • est EnumerationEditor partie de votre usercontrol, vous avez posté uniquement la zone de liste
  • Oui, c'est l'objet UserControl lui-même. Il a une dépendance au Propriété appelée Valeur de type Enum. Mais comme vous pouvez le voir dans les extraits de code, j'utilise exactement la même liaison pour l'Étiquette.L'info-bulle pour le Convertisseur. L'Étiquette.Info-bulle œuvres de l'affiche la valeur correcte. Mais le convertisseur produit l'erreur.
  • Les convertisseurs ne fera pas partie de l'arbre visuel, c'est pourquoi elle ne pourrait pas le trouver. qu'essayez-vous de faire?
  • Je suis en train de créer un éditeur pour un enum tapé à la Propriété (avec l'attribut Flags). L'utilisateur doit être en mesure de sélectionner les indicateurs à l'aide des cases à cocher. Le convertisseur doit définir/effacer l'indicateur spécifique de la propriété et de déterminer si un indicateur est défini.
  • Vous êtes mieux avec un multivalueconverter, de sorte que vous pouvez envoyer ce que la liaison que vous voulez.
  • Toujours le même problème lors de la conversion (drapeau, drapeaux) à (bool) c'est simple et fonctionne. Mais comment faire pour convertir en arrière? l'entrée est (bool) seulement, donc je ne peux pas déterminer la valeur actuelle pour définir/effacer le drapeau. J'avais encore besoin d'ad DP pour trouver la valeur actuelle. Rappelez-vous, je ne veux pas définir la valeur d'un seul drapeau, je veux modifier un seul drapeau uniquement.
  • Sa doit encore être DP de case et pas de convertisseur.
  • stackoverflow.com/questions/326802/...
  • Merci pour le lien - l'exemple fourni fonctionne si je créer les cases à cocher à la main. Mais le ConverterParameter ne peut pas être lié - donc, j'ai toujours le même problème. Je ne sais pas exactement d'un Type enum à utiliser au moment de la compilation, j'ai donc créer les cases à cocher à partir du code. Il semble qu'il n'y est pas de bonne façon de le faire dans le code XAML, donc allons revenir en code C#, derrière.

InformationsquelleAutor Korexio | 2011-07-28