我正在尝试自定义datepicker控件。它基于文本框,我可以选择不同类型的日期。因此,当我专注于文本框时,我创建了一个弹出窗口,其中包含一个列表框,其中添加了以下项目。
Today
Last 7 days
Month to date
Year to date
The previous Month
Specific date
All dates before
All dates after
Date range
如果我在所有项目中进行硬编码,这样可以正常工作。现在我想扩展这个列表,所以我使用Listbox.ItemTemplate,所以我可以自定义listboxitem。我创建了一个DateChoice类,我创建了一个列表并将其绑定到listboxs itemssource。
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 }
};
由于这是一个自定义控件,我已将xaml代码放在资源文件中,它看起来像这样:
<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>
所以我希望它看起来像这样
Today
Last 7 days
Month to date
Year to date
The previous Month
Specific date >
All dates before >
All dates after >
Date range >
这里我使用2个文本框来显示名称,即使可以扩展listboxitem,所以如果我需要选择1或2个特定日期,我可以显示一些日历。但我得到的只是一个填充'&gt;'的列表框。喜欢这个
>
>
>
>
>
>
>
>
>
看起来Text =“{Binding Path = DateChoiceName}”不起作用。我在这里错过了什么?
现在我可以通过执行大量硬编码来解决这个问题,但我更喜欢将我的列表绑定到列表框并使Binding正常工作!!
有人有同样的问题吗?
提前致谢。
答案 0 :(得分:0)
您应该将ListBox
ItemSource
- 属性绑定到DateChoice
属性:
public DataChoice MyDateChoiceCollection { get; set; }
和:
<ListBox ItemSource = {Binding MyDateChoiceCollection}">
...
</ListBox>
答案 1 :(得分:0)
那就像我愚蠢一样容易。
DateChoice Item上的属性需要公开,否则WPF无法访问它们......