Показывать другой текст, когда DataGridComboBoxColumn не находится в режиме редактирования

У меня есть DataGridComboBoxColumn, который привязан к коллекции объектов, тип которой MyItem. MyItem имеет два строковых свойства: Description и Shortcut.

Если столбец не находится в режиме редактирования, я хочу показать строку из свойства ярлыка, а если столбец находится в режиме редактирования, я хочу показать строку из свойства описания.

Возможно ли это без DataGridTemplateColumn?

Дополнительная информация: на данный момент я установил для свойства DisplayMemberPath значение «Описание».


person Mighty Badaboom    schedule 29.04.2014    source источник


Ответы (1)


Я обнаружил, что лучший способ сделать это — использовать DataGridTemplateColumn вместо DataGridComboBoxColumn.

DataGridComboBoxColumn не предоставляет ни CellTemplate (отображается, когда не редактируется), ни CellEditingTemplate (отображается при редактировании), а вместо этого создает для вас шаблоны ComboBox на основе привязок, которые вы передаете столбцу. Поскольку вы хотите, чтобы они были разными, вам нужен столбец, в котором представлены оба этих элемента, то есть DataGridTemplateColumn.

Просто привяжите CellTemplate к Label вашей собственности Shortcut, а CellEditingTemplate к ComboBox с теми же привязками, которые вы присвоили своему DataGridComboBoxColumn.

После всего этого ваша колонка должна выглядеть примерно так

<DataGridTemplateColumn Header="...">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Label Content="{Binding Shortcut}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>

    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <ComboBox ItemsSource="..."
                        DisplayMemberPath="Description"
                        SelectedItem="..."/>
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

Приложение. Причина, по которой я рекомендую использовать здесь Label вместо TextBlock, заключается в том, что Label автоматически включает выравнивание и поля. TextBlock, без них, выглядит очень странно и нуждается в некотором массаже, чтобы выглядеть правильно.

person David    schedule 29.04.2014
comment
Спасибо за пример. Я надеялся, что это будет без DataGridTemplateColumn, но я думаю, что это невозможно:/ - person Mighty Badaboom; 30.04.2014
comment
Если вы действительно этого хотите, вы также можете использовать столбец datagridcombobox и использовать стиль для переопределения CellTemplate. Это, однако, может не работать (все, что определено как встроенное, не может быть установлено с помощью установщика стиля) и требует столько же тегов, сколько и решение TemplateColumn, поэтому я обычно не рекомендую его. - person David; 30.04.2014