【问题标题】:Templating Datatemplate模板化数据模板
【发布时间】:2011-09-15 14:00:53
【问题描述】:

我正在创建一个带有模板项 (DataTemplate) 的 ListBox。在这个模板中,我希望有可能根据绑定到它的数据来改变模板一部分的呈现方式。这是我写的:

    <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 的 DataTamplate?谢谢你的建议。

编辑: 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 的索引属性:

interface IIndex {
    string Label { get; set; }
    IIndexValueProvider ValueProvider { get; set; }
    IIndexValidator Validator { get; set; }
    bool IsEditable { get; set; }
    bool IsGrouped { get; set; }
}

【问题讨论】:

    标签: c# xaml datatemplate


    【解决方案1】:

    您的模板使用静态资源名称“listBoxEditableLable”和“listBoxNonEditableLabel”,但您的数据模板键是“listBoxEditableLable”和“listBoxNonEditableLable”。

    注意标签的不同拼写。 “标签”与“标签”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-19
      • 1970-01-01
      • 2017-01-20
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      • 2020-08-17
      • 2022-07-05
      相关资源
      最近更新 更多