2009-12-17 4 views
0

J'ai un contrôle WPF personnalisé avec un DependencyProperty MaChaîneWPF de liaison d'un FindAncestor à la dépendance de la propriété de contrôle personnalisé

J'utilise le contrôle dans un ItemsControl sur mon point de vue et que vous voulez pêcher une valeur hors de le ViewModel. Comme le DataContext du contrôle devient chaque élément dans ItemsSource du ItemsControl, je pensais pouvoir utiliser FindAncestor mais il semble que ça marche ... quelqu'un peut-il voir où je me trompe s'il vous plait?

Heres le XAML sur la vue ...

<Grid> 
    <ItemsControl ItemsSource="{Binding MyItems}" > 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal" Name="myStack"> 
        <ImportExceptions:ControlStrip MyString="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ItemsControl}}, Path=DataContext.MyStringOnViewModel}" /> 
       </StackPanel> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 

    </ItemsControl> 
</Grid> 

et Heres le code derrière mon contrôle personnalisé où je l'ai créé ma propriété de dépendance ...

public partial class ControlStrip 
{ 

    public ControlStrip() 
    { 
     InitializeComponent(); 
    } 

    public string MyString 
    { 
     get 
     { 
      return GetValue(MyStringProperty).ToString(); 
     } 
     set 
     { 
      SetValue(MyStringProperty, value); 
     } 
    } 

    public static readonly DependencyProperty MyStringProperty = 
     DependencyProperty.RegisterAttached("MyString", typeof (string), typeof (ControlStrip)); 


} 

Répondre

1

Votre code semble bien. Vous avez probablement fait une erreur dans la référence DataContext. De toute évidence, le DataContext de ItemsControl est déjà MyStringOnViewModel. Donc, omettez le .MystringOnViewModel après le DataContext dans l'attribut Path. Si ce n'est pas le cas, pouvez-vous donner un peu plus de code, après une simplification qui imite la façon dont le DataCon, le (s) texte (s) est/sont défini (s)?

+0

Je pensais que c'était une cravate? ;) – kiwipom

+0

Comme vous avez suspecté j'ai trouvé la faute dans la référence DataContext. Merci de votre aide –

3

Le DataContext le contrôle ne change pas - le DataContext pour le ImportExceptions:ControlStrip sera (sauf si explicitement spécifié) le DataContext suivant disponible comme son va 'up' l'arbre visuel ...

Je déduis en om votre code que vous avez défini le DataContext de la vue à un ViewModel avec des les MyItems 'propriétés et « MyStringOnViewModel » - vous devriez être capable de se lier simplement la propriété MaChaîne directement au ViewModel, comme

<ImportExceptions:ControlStrip MyString="{Binding Path=MyStringOnViewModel}" /> 
+0

J'ai peur que vous me battez ;-) – Dabblernl

Questions connexes