2010-02-09 7 views
1

J'ai obtenu un peu de xaml ici et ce que j'essaye de faire, c'est simplement lier une propriété propriété appel (pas le vrai nom) sur la largeur d'un rectangle et de convertir la valeur de cette propriété avec le nom de convertisseur Conv et cela fonctionne parfaitement avec {TemplateBinding Property} ou DataContext = {TemplateBinding Property} ou avec une source relative (comme dans l'exemple de code).Problème avec la liaison dans le convertisseur dans le contrôle personnalisé silverlight

Mon problème est que le paramètre converterParameter doit également être une propriété de liaison, mais je ne suis pas capable de lier aucune propriété dans le paramètre converterParameter. Donc le 30 dans l'exemple devrait être quelque chose comme {Binding Path = SecondProperty}. Si quelqu'un a ce problème ou peut-être si quelqu'un a une autre façon de lier des choses en remerciement de contrôle personnalisé un lot;)

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:controls="clr-namespace:RatingControl"> 
    <Style TargetType="controls:Ctr"> 
    <Setter Property="Template"> 
     <Setter.Value> 
     <ControlTemplate TargetType="controls:Ctr"> 
      <Grid> 
      <Grid.Resources> 
       <controls:Converter x:Name="Conv" /> 
      </Grid.Resources> 
      <Rectangle x:Name="rect" Width="{Binding Path=Property, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource Conv}, ConverterParameter=30}" Height="20" /> 
+0

Bienvenue dans SO, veuillez prendre quelques minutes pour lire la FAQ et la documentation Markdown (dont un synoptique utile est disponible dans la marge de droite lors de la modification d'une question). – AnthonyWJones

Répondre

0

Vous pouvez ajouter une propriété à la classe Converter et lier à cela.

+0

C'est une idée intéressante. Si cela fonctionne, vous devriez vraiment donner cette réponse. Le convertisseur doit être un 'FrameworkElement', la propriété doit être une propriété de dépendance. Il resterait encore à voir s'il est possible d'utiliser la liaison 'RelativeSource' dans un dictionnaire de ressources comme celui-ci. Je ne peux pas penser pourquoi pas. – AnthonyWJones

+0

Ce n'est pas vrai. Le convertisseur n'a pas besoin d'être un élément de structure, juste une classe CLR. –

0

Vous ne pouvez pas lier à une propriété de l'objet Binding, puisqu'il ne s'agit pas d'un DependencyProperty en fait, la liaison n'est pas DependencyObject. Cela est compréhensible pouvez-vous imaginer la complexité de la gestion des arbres de dépendance et la possibilité de liaisons récursives ou circulaires dans les liaisons.

Cependant, vous pouvez utiliser un convertisseur spécialisé pour la tâche: -

public class MySpecialConverter: IValueConverter 
{ 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     Ctr obj = (Ctr)value; 
     var val = obj.Property; 
     var param = obj.SecondProperty; 
     // Do your intended code with val and param here. 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException("This converter only works for one way binding"); 
    } 
} 

maintenant votre Xaml ressemble à: -

<Rectangle x:Name="rect" Height="20" 
    Width="{Binding RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource Conv}" /> 
0

Il est vraiment une bonne solution, mais cela ne fonctionne pas bcs ma première propriété doit être bind (twoWay) parce que si je reçois un changement, le convertisseur doit convertir à nouveau la valeur afin que je récupère le résultat et montre le résultat réel.