Привязка данных в TemplateSelector - PullRequest
0 голосов
/ 03 марта 2012

Я использую несколько шаблонов данных для отображения различных значений, эти шаблоны данных выбираются DataTemplateSelector. Каждый элемент управления имеет некоторую привязку данных к моим пользовательским объектам. Объекты являются частью ObservableCollection, и затем DTS выбирает шаблон для них. Проблема заключается в следующем: когда я пытаюсь запустить свое приложение с некоторыми предварительно определенными объектами (в коде), выбранные элементы управления не имеют значений. Пример:

  <!--Date Template-->
    <DataTemplate x:Key="DateTemplate">
        <WrapPanel x:Name="DateTemplate_Panel">
            <WrapPanel.DataContext>
                <params:FTParams />
            </WrapPanel.DataContext>
            <Label x:Name="DateTemplate_Label" Content="{Binding Path=Name}" />
            <DatePicker x:Name="DateTemplate_DatePicker" SelectedDate="{Binding Path=SelectedValue}" SelectedDateFormat="Long" />
        </WrapPanel>
    </DataTemplate>

Элементы управления отвечают только когда я изменяю их значение (INotifyPropertyChanged реализовано)

Если я установлю

<Label Content="{Binding Path=SelectedValue}"/> 

и я выбираю дату в DataPicker, после чего содержимое загружается правильно. Но мне действительно нужно загрузить эти значения при запуске. Можете ли вы дать мне совет?

1 Ответ

2 голосов
/ 03 марта 2012

Шаблон данных не должен иметь встроенных данных. И вы определенно не хотите создавать экземпляры FTParams изнутри DT. Свойство DataContext объекта DataTemplate устанавливается неявно, когда у вас есть данные где-то еще в дереве.

Я предполагаю, что у вас есть что-то вроде ItemsControl, но для простоты позвольте приведенному ниже примеру иметь элемент управления содержимым:

<ContentControl ContentTemplate="{StaticResource DateTemplate}">
    <params:FTParams />
</contentControl>

Если у вас все ваши элементы в ItemsControl (с привязкой ItemsSource к ObservableCollection), тогда вместо ContentTemplate вы должны установить ItemsTemplate или, если вы хотите работать с селектором шаблонов, установить ItemTemplateSelector.

<ItemsControl ItemsSource="{Binding PathToTheObsCollectionProperty}"
    ItemTemplateSelector="{StaticResource MySelector}" />

Во всех случаях DT не должен был явно устанавливать свойство DataContext.

Затем создайте шаблон данных без элемента DataContext.

...