2013-01-19 4 views
1

Je construis un contrôle personnalisé et je veux passer une collection pour que l'affichage de contrôle que de collecte, mon code est comme suit:comment lier la collecte à un contrôle personnalisé dans WPF

<gm:Calendar SubscriptionSource="{Binding Subscriptions}"></gm:Calendar> 

et contrôle personnalisé "Calendrier"

public static readonly DependencyProperty SubscriptionSourceProperty = 
    DependencyProperty.Register(
     "SubscriptionSource", 
     typeof(ObservableCollection<Subscription>), 
     typeof(Calendar), 
     new FrameworkPropertyMetadata(new ObservableCollection<Subscription>())); 

public ObservableCollection<Subscription> SubscriptionSource 
{ 
    get 
    { 
     return (ObservableCollection<Subscription>)GetValue(SubscriptionSourceProperty); 
    } 
    set 
    { 
     SetValue(SubscriptionSourceProperty, value); 
    } 
} 

J'utilise dans generic.xaml

<ItemsControl ItemsSource="{Binding SubscriptionSource}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <!--Box--> 
      <Border BorderBrush="Black" BorderThickness="1" Padding="0"> 
       <Border Name="InnerBorder" BorderBrush="{Binding Path=Day, Converter={StaticResource DayBorderColorConverter}}" BorderThickness="2"> 
        <Border.Style> 
         <Style TargetType="{x:Type Border}"> 
          <Style.Triggers> 
           <!--Current Day--> 
           <DataTrigger Binding="{Binding IsToday}" Value="true"> 
            <Setter Property="Border.Background"> 
             <Setter.Value> 
              <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
               <GradientStop Color="#FF1EA6C8" Offset="0"/> 
               <GradientStop Color="#FF0691B3" Offset="1"/> 
              </LinearGradientBrush> 
             </Setter.Value> 
            </Setter> 
           </DataTrigger> 
          </Style.Triggers> 
         </Style> 
        </Border.Style> 
        <DockPanel> 
         <!--Day Number--> 
         <StackPanel Orientation="Horizontal" DockPanel.Dock="Top" FlowDirection="RightToLeft"> 
          <TextBlock TextAlignment="Right" Text="{Binding Day.Date, Converter={StaticResource DateConverter}, ConverterParameter=DAY}" FontSize="12" Margin="5,5,5,5" > 
           <TextBlock.Style> 
            <Style TargetType="{x:Type TextBlock}"> 
             <Style.Triggers> 
              <DataTrigger Binding="{Binding IsTargetMonth}" Value="false"> 
               <Setter Property="TextBlock.Foreground" Value="Gray"></Setter> 
              </DataTrigger> 
             </Style.Triggers> 
            </Style> 
           </TextBlock.Style> 
          </TextBlock> 
         </StackPanel> 
         <CheckBox IsEnabled="{Binding IsEnabled}" Style="{StaticResource DiscreteCheckBoxStyle}" /> 
        </DockPanel> 
       </Border> 
      </Border> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <UniformGrid Rows="6" Columns="7" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 

Je veux Liez Abonnements obse Collection rvable pour le contrôle personnalisé de calendrier afin que je puisse utiliser la collection dans le contrôle personnalisé, est-il là pour le faire?

+0

La valeur de la propriété de dépendance sera vide pendant le constructeur car à ce moment-là, WPF n'a même pas construit le contrôle, et encore moins attribué des valeurs aux propriétés de dépendance. Il vaudrait mieux utiliser un PropertyChangedCallback sur la propriété de dépendance au lieu d'essayer d'accéder à la liste dans le constructeur. –

+0

je vous remercie pour votre réponse, comme vous pouvez le voir, je veux Bind abonnements collection observable au calendrier de contrôle personnalisé afin que je puisse utiliser la collection dans le contrôle personnalisé, est-il là pour le faire? –

+0

Comme je l'ai dit, utilisez un PropertyChangedCallback et vous pourrez accéder à la collection dans le contrôle personnalisé. Premier résultat de recherche Google: http://stackoverflow.com/questions/5498517/how-to-use-propertychangedcallback. –

Répondre

0

Mon problème est maintenant résolu grâce à @Luke Woodward et je viens d'avoir un autre problème que j'utilise le contrôle personnalisé à l'intérieur usercontrol et que usercontrol était un élément intérieur ListItem I modifié l'expression de liaison

<gm:Calendar SubscriptionSource="{Binding Path=Subscriptions,Mode=TwoWay}" > 

et la CustomControl est

static Calendar() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(Calendar), new FrameworkPropertyMetadata(typeof(Calendar))); 
    } 

    public ObservableCollection<SubscriptionDay> SubscriptionSource 
    { 
     get { return (ObservableCollection<SubscriptionDay>)GetValue(SubscriptionSourceProperty); } 
     set { SetValue(SubscriptionSourceProperty, value); } 
    } 

    public static readonly DependencyProperty SubscriptionSourceProperty = 
     DependencyProperty.Register("SubscriptionSource", typeof(ObservableCollection<SubscriptionDay>), typeof(Calendar), new FrameworkPropertyMetadata(new ObservableCollection<SubscriptionDay>())); 

et dans le generic.xaml modifié comme @HighCore posté

<ItemsControl ItemsSource="{TemplateBinding SubscriptionSource}"> 
         <ItemsControl.ItemTemplate> 
          <DataTemplate>...... 

et enfin travaillé. Merci à @Luke Woodward et @HighCore

0

Si le ItemsControl est à l'intérieur du ControlTemplate, puis modifiez le {Binding SubscriptionSource} pour {TemplateBinding SubscriptionSource}

+0

J'ai essayé {TemplateBinding SubscriptionSource} mais j'ai quand même la collection vide. –

+0

Etes-vous sûr que la collection actuelle est correctement liée au contrôle? Je veux dire, vérifiez la fenêtre de sortie VS pour voir s'il y a des erreurs de liaison. Sinon, utilisez Snoop pour inspecter l'application en cours et vérifier l'état du contrôle et de ses enfants visuels. –

+0

J'ai essayé de lier la liste des abonnements à ListBox comme un test et cela fonctionne mais ce dont j'ai besoin est de lier la liste au contrôle personnalisé –

Questions connexes