Как установить границу границы в WPF DataGrid? - PullRequest
2 голосов
/ 12 августа 2011

Я использую WPF DataGrid, и он настроен на размещение красной рамки вокруг любой строки, которую пользователь изменяет. Это работает хорошо, однако, когда появляется граница, все ячейки в этом ряду расталкиваются на пиксель или два. Другими словами, левая и правая границы ячейки больше не совпадают с границей над или под ней, поэтому она выглядит странно.

Вот код, который я использую, чтобы красная граница отображалась OnEdit (Примечание: IsDirty - это свойство моего связанного объекта, которое устанавливается при изменении значения):

<Style TargetType="DataGridRow">
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsDirty}" Value="true">
            <Setter Property="BorderBrush" Value="Red" />
            <Setter Property="BorderThickness" Value="1" />                    
        </DataTrigger>
    </Style.Triggers>
</Style>

Что можно добавить, чтобы я мог изменять поля красной границы, чтобы они не мешали границам ячеек?

Спасибо

Ответы [ 2 ]

3 голосов
/ 12 августа 2011

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

Что-то вроде

<Style TargetType="DataGridRow">
    <Setter Property="BorderBrush" Value="Transparent" />
    <Setter Property="BorderThickness" Value="1" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsDirty}" Value="true">
            <Setter Property="BorderBrush" Value="Red" />
        </DataTrigger>
    </Style.Triggers>
</Style>
2 голосов
/ 12 августа 2011

Визуальное дерево выглядит примерно так

  • DataGridRow
    • Border
      • DataGridCellsPresenter

Если вы измените BorderThickness из Border, вы можете компенсировать это, добавив отрицательный Margin.Left к DataGridCellsPresenter одновременно. Не самое красивое решение, но оно работает

<DataGrid ...>
    <DataGrid.Resources>
        <Style TargetType="DataGridCellsPresenter">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsDirty}" Value="true">
                    <Setter Property="Margin" Value="-1,0,0,0" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.Resources>
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsDirty}" Value="true">
                    <Setter Property="BorderBrush" Value="Red" />
                    <Setter Property="BorderThickness" Value="1" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.RowStyle>
    <!--...-->
</DataGrid>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...