2009-10-20 5 views
0

J'essaie d'adapter une solution pour le calendrier de la boîte à outils WPF de http://msdn.microsoft.com/en-us/magazine/dd882520.aspx mais j'ai des problèmes pour obtenir une liaison sur la commande usercontrol. J'ai essayé d'utiliser FindAncestor et ElementName, mais j'ai juste une erreur de liaison.Liaison à une DependencyProperty d'un UserControl

Je pense que cela peut avoir quelque chose à voir avec l'info-bulle et c'est DataContext dans le calendrier. Quelqu'un d'autre a-t-il eu ce problème?

<UserControl x:Class="ChickenPing.MealCalendar" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:conv="clr-namespace:ChickenPing.Converters" 
    xmlns:wpf="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit" 
    xmlns:primitives="clr-namespace:Microsoft.Windows.Controls.Primitives;assembly=WPFToolkit" 
    xmlns:vsm="clr-namespace:System.Windows;assembly=WPFToolkit" 
    xmlns:loc="clr-namespace:ChickenPing" 
    x:Name="root"> 
    <wpf:Calendar x:Name="calendar"> 
     <wpf:Calendar.Resources> 
      <conv:IconConverter x:Key="IconConverter"/> 
      <conv:MealCalendarConverter x:Key="MealCalendarConverter" /> 
      <!--LinearGradientBrush x:Key="MealBackgroundFill" StartPoint="0,0" EndPoint="0,1"> 
       <GradientStop Color="" 
      </LinearGradientBrush--> 
     </wpf:Calendar.Resources> 
     <wpf:Calendar.CalendarDayButtonStyle> 
      <Style TargetType="primitives:CalendarDayButton"> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="primitives:CalendarDayButton"> 
          <Grid> 
           <!Grid.ToolTip> 
            <ToolTip> 
             <ToolTip.DataContext> 
              <MultiBinding Converter="{StaticResource MealCalendarConverter}"> 
               <Binding Path="PlacementTarget.DataContext" RelativeSource="{x:Static RelativeSource.Self}"/> 
               <Binding Path="Meals"> 
                <Binding.RelativeSource> 
                 <RelativeSource Mode="FindAncestor" AncestorType="{x:Type loc:MealCalendar}" /> 
                </Binding.RelativeSource> 
               </Binding> 
              </MultiBinding> 
             </ToolTip.DataContext> 

L'erreur est:

System.Windows.Data Warning: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='MyAssembly.MyControl', AncestorLevel='1''. BindingExpression:Path=ConversionCollection; DataItem=null; target element is 'ToolTip' (Name=''); target property is 'DataContext' (type 'Object') 

Et la déclaration du DependencyProperty:

public static readonly DependencyProperty MealsProperty = DependencyProperty.Register("Meals", typeof(Dictionary<DateTime, IEnumerable<PlannedMealGroup>>), typeof(MealCalendar), new UIPropertyMetadata(new Dictionary<DateTime, IEnumerable<PlannedMealGroup>>())); 
public Dictionary<DateTime, IEnumerable<PlannedMealGroup>> Meals { 
    get { return base.GetValue(MealsProperty) as Dictionary<DateTime, IEnumerable<PlannedMealGroup>>; } 
    set { 
     base.SetValue(MealsProperty, value); 
    } 
} 

Il y a un autre contrôle que j'ai où la même chose, donc je pense que je manquerai quelque chose.

+0

J'ai mis à jour ma réponse en réponse à vos modifications. –

Répondre

0

ConversionCollection est une propriété du contrôle utilisateur 'MyControl'? Si c'est le cas, vous devez définir le DataContext pour ce contrôle utilisateur sur lui-même car la valeur par défaut de cette propriété est null.

public MyControl() 
{ 
    DataContext = this; 
} 

Edit: j'ai remarqué dans votre déclaration de la propriété de dépendance ConversionCollectionProperty vous déclarez le nom de « repas », mais la propriété est en fait ConversionCollection. Ces noms doivent correspondre pour que la propriété de dépendance fonctionne comme prévu.

public static readonly DependencyProperty ConversionCollectionProperty = 
    DependencyProperty.Register(
     "ConversionCollection", 
     typeof(Dictionary<DateTime, IEnumerable<PlannedMealGroup>>), 
     typeof(MyControl), 
     new UIPropertyMetadata(new Dictionary<DateTime, 
     IEnumerable<PlannedMealGroup>>())); 

public Dictionary<DateTime, IEnumerable<PlannedMealGroup>> ConversionCollection 
{ 
    get 
    { 
     return base.GetValue(ConversionCollectionProperty) as Dictionary<DateTime, IEnumerable<PlannedMealGroup>>; 
    } 
    set 
    { 
     base.SetValue(ConversionCollectionProperty, value); 
    } 
+0

Oui c'est. J'ai mis à jour le poste avec plus de détails. – Echilon

+0

Désolé, je ne sais vraiment pas pourquoi j'ai changé les noms. Mise à jour de l'original avec les noms réels du contrôle. – Echilon

Questions connexes