我使用一些数据模板来显示不同的值,这些数据模板由DataTemplateSelector选择。每个控件都有一些DataBinding到我的自定义对象。对象是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中选择一个日期,然后正确加载内容。但我真的需要在启动时加载这些值。 你能给我一些建议吗?
答案 0 :(得分:2)
数据模板不应包含嵌入数据。而你绝对不想在DT中实例化FTParams的实例。当您在树中的其他位置拥有数据时,将隐式设置DataTemplate的DataContext属性。
我假设你有某种ItemsControl,但为简单起见,让下面的示例有一个内容控件:
<ContentControl ContentTemplate="{StaticResource DateTemplate}">
<params:FTParams />
</contentControl>
如果你有ItemsControl中的所有项目(ItemsSource绑定到ObservableCollection),那么你应该设置ItemsTemplate而不是ContentTemplate,或者如果你想使用模板选择器,设置ItemTemplateSelector。
<ItemsControl ItemsSource="{Binding PathToTheObsCollectionProperty}"
ItemTemplateSelector="{StaticResource MySelector}" />
在所有情况下,DT都不应该显式设置DataContext属性。
然后使用没有DataContext元素的数据模板。