Использовать привязку в шаблоне элемента списка для настраиваемого элемента управления - PullRequest
0 голосов
/ 01 сентября 2011

Я пытаюсь сделать пользовательский элемент управления 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, чтобы я мог настроить элемент listbox.У меня есть класс DateChoice, для которого я создаю список и связываю его с источником элементов списка.

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 текстовых поля, чтобы показать имя, и даже если возможно расширить элемент списка, чтобы я мог показать некоторыекалендари, если мне нужно выбрать 1 или 2 конкретные даты.Но все, что я получаю, это список, заполненный '>'Вот так

 >
 >
 >
 >
 >
 >
 >
 > 
 > 

Похоже, что Text = "{Binding Path = DateChoiceName}" не работает.Что мне здесь не хватает?

Теперь я могу решить эту проблему с помощью большого количества жесткого кодирования, но я предпочитаю привязать мой список к списку и заставить работать привязку !!

У кого-нибудь есть такая же проблема?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 01 сентября 2011

Ну, это было так же легко, как и я тупой.

Свойство DateChoiceItem должно быть открытым, иначе WPF не сможет получить к ним доступ ...

0 голосов
/ 01 сентября 2011

Вы должны привязать свойство ListBox ItemSource к свойству DateChoice:

public DataChoice MyDateChoiceCollection { get; set; }  

и:

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