在Listbox Itemtemplate中使用Binding作为自定义控件

时间:2011-09-01 07:18:51

标签: wpf itemtemplate

我正在尝试自定义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正常工作!!

有人有同样的问题吗?

提前致谢。

2 个答案:

答案 0 :(得分:0)

您应该将ListBox ItemSource - 属性绑定到DateChoice属性:

public DataChoice MyDateChoiceCollection { get; set; }  

和:

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

答案 1 :(得分:0)

那就像我愚蠢一样容易。

DateChoice Item上的属性需要公开,否则WPF无法访问它们......