Как установить стиль для ячеек GridView

Я озадачен тем, как просто выровнять по правому краю некоторые столбцы в GridView без написания тонны разметки для каждого столбца.

Я не могу использовать статический CellTemplate, потому что шаблоны ячеек игнорируются, когда вы одновременно устанавливаете DisplayMemberBinding (см. примечания в MSDN). Без DisplayMemberBinding я бы вернулся к одному пользовательскому шаблону ячейки для каждого столбца, потому что привязка отличается, а этого я хочу избежать.

Так что стиль был бы отличным, как мы можем использовать для заголовка:

<GridViewColumn DisplayMemberBinding="{Binding Bla}" HeaderContainerStyle="{StaticResource RightAlignStyle}" />

Однако я не могу найти свойство для установки стиля для элементов ячейки.

Наверное, я скучаю по лесу за деревьями...


person realMarkusSchmidt    schedule 14.11.2011    source источник
comment
Привет, столбцы каких типов вы используете - только DataGridTextBoxColumns?   -  person    schedule 14.11.2011
comment
Вот похожий, интересно, поможет ли это: stackoverflow.com/questions/3652318/ выравнивание текста в сетке данных   -  person    schedule 14.11.2011
comment
@ Дмитрий, в данном случае он доступен только для чтения, поэтому я использую TextBlock. Очень просто, поэтому я хочу избежать пользовательских CellTemplate для многих столбцов.   -  person realMarkusSchmidt    schedule 14.11.2011
comment
Что касается другого вопроса SO, который вы упомянули: похоже, это решение не позволит мне установить выравнивание для каждого столбца только для всей сетки. С другой стороны, я лишь поверхностно касаюсь возможностей WPF, поэтому, возможно, упускаю из виду что-то очевидное. Спасибо большое!   -  person realMarkusSchmidt    schedule 14.11.2011
comment
WPF ListView не имеет понятия cell. Я рекомендую использовать для этого гораздо лучшее управление пользовательским интерфейсом, например DataGrid.   -  person WPF-it    schedule 14.11.2011
comment
AngelWPF — DataGrid тоже.   -  person    schedule 14.11.2011
comment
@AngelWPF, я не знаю, что ты имеешь в виду под понятием клетки. Для каждого столбца есть заголовок и элементы (или ячейки). Есть GridViewColumn.HeaderTemplate и GridViewColumn.CellTemplate. Что касается DataGrid: поскольку мне это нужно только для отображения, а не для редактирования, я предпочел ListView, чтобы он оставался компактным (но я не знаю, имеет ли это предположение смысл на самом деле).   -  person realMarkusSchmidt    schedule 14.11.2011
comment
@Дмитрий, не соглашусь. DataGrid имеет четко определенный и идентифицируемый объект контента под названием DataGridCell. ListView нет. @markus, ListView.CellTemplate - это в основном логическая концепция того, какой шаблон будет представлен в столбце в каждой строке. К сожалению, это не соответствует cell, так как ListView не имеет такого объекта с именем ListViewCell.   -  person WPF-it    schedule 15.11.2011


Ответы (2)


Маркус, вот что я бы сделал. Укусите пулю и по цене написания 10 строк кода получите первоклассную поддержку выравнивания и любых других неподдерживаемых свойств. вы можете пройтись по визуальному дереву и найти PART_* для тяжелой тонкой настройки.

Решение:

1. Класс выравниваемых столбцов:

namespace AlignableCellsProject
{
    public class AlignableTextColumn: DataGridTextColumn
    {
        protected override System.Windows.FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
        {
            FrameworkElement element = base.GenerateElement(cell, dataItem);
            element.SetValue(FrameworkElement.HorizontalAlignmentProperty, this.HorizontalAlignment);

            return element;
        }

        protected override System.Windows.FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
        {
            FrameworkElement element = base.GenerateEditingElement(cell, dataItem);
            element.SetValue(FrameworkElement.HorizontalAlignmentProperty, this.HorizontalAlignment);

            return element;
        }

        public HorizontalAlignment HorizontalAlignment
        {
            get { return (HorizontalAlignment)this.GetValue(FrameworkElement.HorizontalAlignmentProperty); }
            set { this.SetValue(FrameworkElement.HorizontalAlignmentProperty, value); }
        }
    }
}

2. XAML потребителя:

<Window x:Class="AlignableCellsProject.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:AlignableCellsProject"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid x:Name="g" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <local:AlignableTextColumn HorizontalAlignment="Left"
                                           Width="200" Binding="{Binding}"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

3 - Код потребителя позади:

namespace AlignableCellsProject
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.Loaded += 
                (o, e) => 
                {
                    this.g.ItemsSource = Enumerable.Range(1, 3);
                };
        }
    }
}

person Community    schedule 14.11.2011
comment
Большое спасибо за вашу работу! Интересный подход, попробую. Возможно, я смогу даже расширить это, чтобы угадать правильное выравнивание на основе типа связанного свойства (например, числовое -> выравнивание по правому краю, текстовое -> выравнивание по левому краю). - person realMarkusSchmidt; 14.11.2011
comment
Это интересная настройка во всех смыслах! - person ; 14.11.2011

Я не использую .Net 4.0, но это служит цели...

   <tk:DataGrid ItemsSource="{Binding}" IsReadOnly="True" AutoGenerateColumns="True">
        <tk:DataGrid.Resources>
            <Style x:Key="MyAlignedColumn" TargetType="{x:Type tk:DataGridCell}">
                <Setter Property="HorizontalAlignment" Value="Right"/>
                <Setter Property="HorizontalContentAlignment" Value="Left"/>
            </Style>
        </tk:DataGrid.Resources>
        <tk:DataGridTextColumn Header="Name"
                               CellStyle="{StaticResource MyAlignedColumn}"
                               Binding="{Binding Name, Mode=TwoWay}"/>
    </tk:DataGrid>
person WPF-it    schedule 15.11.2011
comment
+1, я использовал это. Чтобы добавить к этому, если мы хотим, чтобы конкретный столбец демонстрировал выравнивание, мы можем установить DataGridColumn.CellStyle={StaticResource CellAlignmentStyle}, где CellAlignmentStyle — это ключ, назначенный стилю выше. - person ; 15.11.2011
comment
Вопрос был для ListView с GridView, а не DataGrid. - person Olly; 26.03.2014