2011-09-01 57 views
0

我正在嘗試執行自定義的日期選擇器控件。它基於一個文本框,我可以選擇不同類型的日期。因此,當我將注意力放在文本框上時,我創建了一個彈出窗口,其中包含添加以下項目的列表框。在自定義控件的列表框項目模板中使用綁定

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代碼在resourcefiles一個customcontrol,它看起來像這樣:

       <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個特定的日期。但我得到的是一個充滿'>'的列表框。像這樣

> 
> 
> 
> 
> 
> 
> 
> 
> 

它看起來像Text =「{Binding Path = DateChoiceName}」不起作用。我在這裏錯過了什麼?

現在我可以通過做很多硬編碼來解決這個問題,但我優先考慮將列表綁定到列表框並使綁定工作!

有沒有人有同樣的問題?

在此先感謝。

回答

0

好,這是因爲我stupied一樣容易。

上DateChoiceItem財產必須公開,否則WPF不能訪問他們...

0

您應該ListBoxItemSource,物業綁定到DateChoice物業:

public DataChoice MyDateChoiceCollection { get; set; } 

和:

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

我需要的是,是不是不夠,我將它綁定在我的代碼?因爲所有的項目都被填充到列表框中,但是「綁定路徑」不起作用... –

+0

啊,我明白了。那麼'ListBox'的名字應該是'DateChoice'而不是'PART_DateChoice'? – WaltiD

+0

我不認爲這是一個問題,因爲DateChoice只是我在控件中用來引用列表框的內部名稱,像這樣:private ListBox DateChoice {get {return this.Template.FindName(「PART_DateChoice」,this)as ListBox; }} –

相關問題