Templating Datatemplate
本文关键字:Datatemplate Templating | 更新日期: 2023-09-27 18:08:36
我正在创建一个ListBox与模板项目(DataTemplate)。在这个模板中,我希望有可能根据绑定到它的数据来改变模板的一部分的呈现方式。这是我写的:
<ListBox Grid.Row="1"
ItemsSource="{Binding Indices}"
HorizontalContentAlignment="Stretch">
<DataTemplate>
<Grid Margin="3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="4*"/>
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<!-- ****this does not work ;(**** -->
<ContentPresenter Grid.Column="0"
Content="{Binding}">
<ContentPresenter.ContentTemplateSelector>
<tmpl:BoolBasedSelector
Value="{Binding IsEditable, ElementName=MainCtrl}"
TrueTemplate="{StaticResource listBoxEditableLabel}"
FalseTemplate="{StaticResource listBoxNonEditableLabel}" />
</ContentPresenter.ContentTemplateSelector>
</ContentPresenter>
<!-- other stuff, not important right now -->
<Button Grid.Column="1" />
<Button Grid.Column="2" />
</Grid>
</DataTemplate>
</ListBox>
MainCtrl是主控件的名称,其中放置了包含此列表的网格。我如何写ListBox的数据模板与可交换的网格的元素?谢谢你的建议。
编辑:tmpl:BoolBasedSelector真的很简单:
class BoolBasedSelector: DataTemplateSelector {
public bool Value { get; set; }
public DataTemplate TrueTemplate { get; set; }
public DataTemplate FalseTemplate { get; set; }
public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container) {
return Value ? TrueTemplate : FalseTemplate;
}
}
引用的资源如下所示:
<DataTemplate x:Key="listBoxEditableLable">
<TextBox Text="{Binding Label}" />
</DataTemplate>
<DataTemplate x:Key="listBoxNonEditableLable">
<TextBlock Text="{Binding Label}" />
</DataTemplate>
ListBox绑定的DataContext的Indices属性:
interface IIndex {
string Label { get; set; }
IIndexValueProvider ValueProvider { get; set; }
IIndexValidator Validator { get; set; }
bool IsEditable { get; set; }
bool IsGrouped { get; set; }
}
你的模板使用静态资源名称"listBoxEditableLable"answers"listBoxNonEditableLabel",但是你的数据模板键是"listBoxEditableLable"answers"listBoxNonEditableLable"
注意label的不同拼写。"Label" vs "Label"