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.
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 ... –
Ah, je vois. Est-ce que le nom de ListBox doit alors être 'DateChoice' au lieu de' PART_DateChoice'? – WaltiD
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; }} –