Шаблонная табличка с данными - PullRequest
1 голос
/ 15 сентября 2011

Я создаю 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 - это имя основного элемента управления, в котором находится сетка, содержащая этот список. Как мне написать DataTamplate ListBox с элементом сменной сетки? Спасибо за советы.

EDIT: 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>

Индексирует свойство DataContext, к которому привязывается ListBox:

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

1 Ответ

0 голосов
/ 22 сентября 2011

В вашем шаблоне используются статические имена ресурсов "listBoxEditableLable" и "listBoxNonEditableLabel", но вашими ключами шаблона данных являются "listBoxEditableLable" и "listBoxNonEditableLable".

Обратите внимание на различные варианты написания метки. «Этикетка» против «Лейбл»

...