DatGridCell получает сброс при применении пользовательского стиля - PullRequest
0 голосов
/ 23 мая 2019

У меня есть DataGrid, который содержит данные, и я хочу сделать все данные в этом dataGrid центрированными в его DataGridCell, в котором он находится.

Так я и сделал (файл xaml)

<Window x:Class="WPF_Prj.View.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:col="clr-namespace:System.Collections;assembly=mscorlib"
    xmlns:local="clr-namespace:WPF_Prj.View"
    xmlns:vm="clr-namespace:WPF_Prj.ViewModel"
    Title="[Portfolio] MainWindow" Height="500" Width="800">


<StackPanel Orientation="Vertical">
    <DataGrid x:Name="datagrid" AutoGenerateColumns="False" CanUserAddRows="False"
            Width="Auto" Margin="5,5,0,5" HorizontalAlignment="Left" CellEditEnding="datagrid_CellEndEditing">

        <DataGrid.Resources>
            <vm:PositiveConverter x:Key="PositiveConverter"/>                
            <Style TargetType="{x:Type DataGridCell}">
                <Setter Property="TextBlock.TextAlignment" Value="Center"/>
                <Setter Property="HorizontalAlignment" Value="Stretch"/>
            </Style>
        </DataGrid.Resources>

        <DataGrid.Columns>
            <DataGridTextColumn                             Header="Name"           Binding="{Binding Name}"                                    IsReadOnly="True"   Width="Auto"/>
            <DataGridTextColumn                             Header="Owned Qty"      Binding="{Binding OwnedQty}"                                IsReadOnly="True"   Width="Auto"/>
            <DataGridTextColumn x:Name="_UnitCost"          Header="Unit Cost"      Binding="{Binding UnitCost}"            IsReadOnly="True"                       Width="Auto"/>
            <DataGridTextColumn x:Name="_MarketCost"        Header="Market Cost"    Binding="{Binding MarketCost}"          IsReadOnly="True"                       Width="Auto"/>
            <DataGridTextColumn     Header="Ordered Qty"    Binding="{Binding OrderedQty,       Mode=TwoWay }"                                 IsReadOnly="False"  Width="Auto">
                <DataGridTextColumn.CellStyle>
                    <Style TargetType="DataGridCell" >
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding ColorCost}" Value="-1">
                                <Setter Property="Background" Value="Moccasin"/>
                                <Setter Property="Foreground" Value="Black"/>
                                <Setter Property="BorderThickness" Value="3"/>
                                <Setter Property="HorizontalAlignment" Value="Stretch"/>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding ColorCost}" Value="1">
                                <Setter Property="Background" Value="GreenYellow"/>
                                <Setter Property="Foreground" Value="Black"/>
                                <Setter Property="BorderThickness" Value="3"/>
                                <Setter Property="HorizontalAlignment" Value="Stretch"/>
                                <Setter Property="HorizontalContentAlignment" Value="Center"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </DataGridTextColumn.CellStyle>
            </DataGridTextColumn>
            <DataGridTextColumn   Header="Confirmed Qty"  Binding="{Binding ConfirmedQty, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay }" IsReadOnly="True"   Width="Auto"/>
        </DataGrid.Columns>

    </DataGrid>
    <StackPanel Name="ButtomsZone" Orientation="Horizontal">
        <Button x:Name="YellOrders"  Content="Simulate Orders" Width="125" FontFamily="Fire Code" Click="YellOrders_Click" Margin="18,0" Height="25"/>
        <Button x:Name="Confirm"   Content="Confirm Orders"  Width="125" FontFamily="Fire Code" Click="Confirm_Click" Margin="25,0" IsEnabled="False"/>            
        <ComboBox>
            <ComboBoxItem IsSelected="True">Prioritize cheap goods</ComboBoxItem>
            <ComboBoxItem>Prioritize expensive goods</ComboBoxItem>    
        </ComboBox>
    </StackPanel>
</StackPanel>
</Window>

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

enter image description here

Вопрос в том, как я могу сделать эту колонку растянутой и центрировать ее содержимое? Заранее спасибо.

1 Ответ

1 голос
/ 23 мая 2019

Вы явно устанавливаете CellStyle для этого столбца, что означает, что он не использует неявный стиль DataGridCell, определенный вами в DataGrid.Resources.

Это легко исправить одним из двух способов: либо добавьте эти два установщика выравнивания в стиль для "Ordered Qty", либо, что лучше, используйте атрибут BasedOn для base , которыйстиль в стиле по умолчанию, который заставит его наследовать все, что имеет стиль по умолчанию:

<DataGridTextColumn.CellStyle>
    <Style 
        TargetType="DataGridCell" 
        BasedOn="{StaticResource {x:Type DataGridCell}}"
        >
        <Style.Triggers>
            <DataTrigger Binding="{Binding ColorCost}" Value="-1">

Если вы добавите что-то еще в стиль ячейки по умолчанию на следующей неделе, он будет автоматически включен в специализированный стильдля "Заказанного Кол-во".

Обновление: что происходит с выравниванием?

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

По умолчанию этот TextBox или TextBlock растягивается, чтобы заполнить всю ширину DataGridCell, потому что именно так DataGridCell делает со своим содержимым.Вам не нужен ни один из этих установщиков HorizontalAlignment.Они излишни.Я бы удалил их по этой причине: мне не нравится оставлять на месте код, запрещающий работу, потому что в следующем году я или кто-то еще вернусь к коду и, возможно, потрачу время на то, чтобы подумать, что он есть по какой-то причине.

В некоторых элементах управления списком, таких как ListBox, содержимое элемента выравнивается по левому краю, и вам может потребоваться установить HorizontalContentAlignment в ListBox.Это не относится к DataGrid.На самом деле, если вы хотите увидеть что-то странное, попробуйте это для неявного DataGridCellStyle:

<DataGrid.Resources>
    <Style TargetType="{x:Type DataGridCell}">
        <Setter Property="TextBlock.TextAlignment" Value="Center"/>
        <Setter Property="HorizontalAlignment" Value="Left"/>
    </Style>
</DataGrid.Resources>

Здесь элемент управления, отображающий текст, имеет такую ​​же ширину, как и его содержимое.Он по-прежнему центрирует контент, но вы не можете сказать, потому что нет места с обеих сторон.Также линии выглядят забавно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...