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.
Vous devez vous connecter pour publier un commentaire.
Un convertisseur n'est pas un
FrameworkElement
de sorte qu'il ne devrait pas hériter de cette classe, au mieux, utiliserDependencyObject
.Depuis le convertisseur n'est pas de tout arbre que la liaison ne fonctionne pas, vous pouvez essayer:
(Cependant cela doit être placé dans le
Resources
de laUserControl
et référencées, sinon lex:Référence
va provoquer une dépendance cyclique d'erreur.)Noter que le
Flag
liaison tente de se lier à laDataContext
qui peut ne pas fonctionner comme leDataContext
ne peut pas être héritée pour les mêmes raisons queElementName
etRelativeSource
ne fonctionnera pas.Conclusion
J'ai décidé de résoudre le problème à l'aide de deux UserControls; FlagControl et EnumerationEditorControl.
La FlagControl a deux propriétés de dépendance
La EnumerationEditorControl a une propriété de dépendance:
La EnumerationEditorControl utilise un DataTemplate pour instancier FlagControls. Le DataTemplate lie la FlagControl.Drapeau à la propriété DataContext et la FlagControl.La valeur de la propriété à la EnumerationEditorControl.La valeur de la propriété.
De cette façon, je n'ai pas besoin d'un convertisseur et la logique est clairement séparés.
Merci pour les suggestions, les commentaires et les réponses!