2011-09-01 1 views
0

J'essaye de faire un contrôle personnalisé de datepicker. Il est basé sur une zone de texte dans laquelle je peux sélectionner différents types de dates. Donc, quand je me concentre sur la zone de texte, je crée une fenêtre contextuelle qui a une zone de liste où les éléments suivants sont ajoutés.Utilisation de la liaison dans un Listbox ItemTemplate pour un contrôle personnalisé

Today 
Last 7 days 
Month to date 
Year to date 
The previous Month 
Specific date 
All dates before 
All dates after 
Date range 

Cela fonctionne très bien, si je code en dur dans tous les éléments. Maintenant, je veux étendre cette liste afin que j'utilise le Listbox.ItemTemplate à la place afin que je puisse personnaliser le listboxitem. J'ai créé une classe DateChoice dans laquelle je crée une liste et la lie à la liste des éléments listboxs.

internal class DateChoiceItem 
{ 
    internal DateChoiceEnum DateChoiceEnum { get; set; } 
    internal string DateChoiceName { get; set; } 
    internal bool ExtendedCalender { get; set; } 
} 

    this.DateChoice.ItemsSource = new ObservableCollection<DateChoiceItem>() { 
     new DateChoiceItem(){DateChoiceName = "Today", DateChoiceEnum = DateChoiceEnum.Today}, 
     new DateChoiceItem(){DateChoiceName = "Last 7 days", DateChoiceEnum = DateChoiceEnum.Last7Days}, 
     new DateChoiceItem(){DateChoiceName = "Month to date", DateChoiceEnum = DateChoiceEnum.MonthToDate}, 
     new DateChoiceItem(){DateChoiceName = "Year to date", DateChoiceEnum = DateChoiceEnum.YearToDate}, 
     new DateChoiceItem(){DateChoiceName = "The previous Month", DateChoiceEnum = DateChoiceEnum.PreviousMonth}, 
     new DateChoiceItem(){DateChoiceName = "Specific date", DateChoiceEnum = DateChoiceEnum.SpecificDate, ExtendedCalender = true}, 
     new DateChoiceItem(){DateChoiceName = "All dates before", DateChoiceEnum = DateChoiceEnum.AllDatesBefore, ExtendedCalender = true}, 
     new DateChoiceItem(){DateChoiceName = "All dates after", DateChoiceEnum = DateChoiceEnum.AllDatesAfter, ExtendedCalender = true}, 
     new DateChoiceItem(){DateChoiceName = "Date range", DateChoiceEnum = DateChoiceEnum.DateRange, ExtendedCalender = true } 
    }; 

Depuis c'est un CustomControl j'ai mis le XAML code dans un resourcefiles et il ressemble à ceci:

       <ListBox x:Name="PART_DateChoice" Grid.Column="0" Grid.Row="0"> 
            <ListBox.ItemTemplate> 
             <DataTemplate> 
              <Grid> 
               <Grid.ColumnDefinitions> 
                <ColumnDefinition Width="*"/> 
                <ColumnDefinition Width="5"/> 
                <ColumnDefinition Width="16"/> 
               </Grid.ColumnDefinitions> 

               <TextBlock x:Name="name" Grid.Column="0" Text="{Binding Path=DateChoiceName}"/> 
               <TextBlock Grid.Column="2" Text=">" Visibility="{Binding Path=ExtendedCalender, Converter={StaticResource BooleanToVisibilityConverter}}"/> 
              </Grid> 
             </DataTemplate> 
            </ListBox.ItemTemplate> 
           </ListBox> 

Je veux que ça ressemble à ce

Today 
Last 7 days 
Month to date 
Year to date 
The previous Month 
Specific date  > 
All dates before > 
All dates after  > 
Date range   > 

Ici, j'utilise 2 zones de texte pour afficher le nom et même s'il est possible d'étendre le listbox afin que je puisse afficher des calendriers si j'ai besoin de sélectionner 1 ou 2 dates spécifiques. Mais tout ce que je reçois est une liste remplie de '>'. Comme ceci

> 
> 
> 
> 
> 
> 
> 
> 
> 

Il semble que Text = "{Binding Path = DateChoiceName}" ne fonctionne pas. Qu'est-ce que j'oublie ici?

Maintenant, je peux résoudre cela en faisant beaucoup de hardcoding, mais je préfère lier ma liste à la liste et obtenir le travail de liaison !!

Est-ce que quelqu'un a le même problème?

Merci d'avance.

Répondre

0

Eh bien, ce fut aussi facile que je suis stupied.

La propriété sur DateChoiceItem doit être public ou bien le WPF ne peut pas y accéder ...

0

Vous devez lier le ListBoxItemSource -Property à la propriété DateChoice:

public DataChoice MyDateChoiceCollection { get; set; } 

et:

<ListBox ItemSource = {Binding MyDateChoiceCollection}"> 
    ... 
</ListBox> 
+0

Ai-je besoin que, est-ce pas assez que je lie dans mon code? Parce que tous les éléments sont peuplés dans la liste, mais le "Chemin de liaison" ne fonctionne pas ... –

+0

Ah, je vois. Est-ce que le nom de ListBox doit alors être 'DateChoice' au lieu de' PART_DateChoice'? – WaltiD

+0

Je ne pense pas que ce soit un problème puisque le DateChoice est seulement le nom interne que j'utilise dans mon contrôle pour référencer la listbox comme ceci: private ListBox DateChoice {get {return this.Template.FindName ("PART_DateChoice", this) comme ListBox; }} –

Questions connexes