2012-03-03 3 views
0

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

<!--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 затем содержимое загружается правильно , Но мне действительно нужно, чтобы эти значения загружались при запуске. Можете ли вы дать мне совет?

+0

Можете ли вы привести пример класса в ObservableCollection, к которому это привязано? – kaj

ответ

2

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

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

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

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

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

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

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

+0

Я удалил DataContext из Шаблонов, и он работает правильно. Спасибо за Ваш ответ. – arche89