2011-10-17 28 views
50

Tôi đang sử dụng DataGrid WPF4.0. Khi nhấp đúp vào một ô trong một hàng mới, mọi thứ hoạt động tốt trừ khi Tôi đã thêm kiểu ô vào cột đó. Ví dụ, tôi có một cột số nơi tôi muốn liên kết dữ liệu đúng như vậy XAML trông như thế nàyLàm thế nào để có được một tế bào DataFrid WPF để căn phải mà không làm cho khu vực lựa chọn trên một hàng mới nhỏ?

<DataGridTextColumn Binding="{Binding Path=ImpaId}" 
        CellStyle="{StaticResource CellRightAlign}"> 
    <DataGridTextColumn.Header> 
      <TextBlock Style="{StaticResource DataGridHeader}">Impa</TextBlock> 
    </DataGridTextColumn.Header> 
</DataGridTextColumn> 

Trường hợp phong cách trong một nguồn tài nguyên chia sẻ chỉ là:

<Style x:Key="CellRightAlign"> 
    <Setter Property="Control.HorizontalAlignment" 
      Value="Right" /> 
</Style> 

Kết quả là khu vực có thể lựa chọn trên một hàng mới được hiển thị trong hình ảnh là khu vực nhỏ màu xanh. Đây là một mục tiêu rất nhỏ để người dùng nhấn, và điều này xảy ra là cột có khả năng nhất mà họ sẽ muốn bắt đầu bằng một hàng mới.

DataGrid cell with tiny width

Nếu tôi loại bỏ các CellStyle, khu vực này hoạt động như mong muốn nhưng tất nhiên tôi đã làm mất sự liên kết đúng.

DataGrid cell with proper width

Có ai biết cách đạt được cả hai không?

Những điều tôi đã cố gắng

  1. Thiết TargetNullValue trên ràng buộc sang một định dạng với một số chiều rộng. Tính năng này hoạt động trên các hàng hiện có nhưng không ảnh hưởng đến hàng mới.
  2. Đặt MinWidth trên cột, điều này không ảnh hưởng đến chiều rộng của hàng mới có thể chọn khu vực.

Thing mà làm việc:

Sử dụng thông tin từ câu trả lời của @AngelWPF tôi đã có thể thay đổi từ việc sử dụng CellStyle để sử dụng ElementStyle như sau:

<DataGridTextColumn Binding="{Binding Path=ImpaId}" 
        CellStyle="{StaticResource CellRightAlign}"> 

Trở thành

<DataGridTextColumn Binding="{Binding Path=ImpaId}" 
        ElementStyle="{StaticResource CellRightAlign}"> 
+0

Vấn đề tương tự nhưng không biết câu trả lời: http://stackoverflow.com/questions/18378515/how-to-make-cell-to-take-full-width-when-aligned-to-right -or-left-in-wpf-grid – digz6666

Trả lời

71

Bạn có thể áp dụng ElementStyle trên DataGridTextColumn nhắm mục tiêu vào TextBlock và phải sắp xếp đó, nó sẽ làm việc.

 <DataGridTextColumn Binding="{Binding Path=ImpaId}"> 
      <DataGridTextColumn.Header> 
       <TextBlock Style="{StaticResource 
            DataGridHeader}"> 
        Impa 
       </TextBlock> 
      </DataGridTextColumn.Header> 
      <DataGridTextColumn.ElementStyle> 
       <Style TargetType="{x:Type TextBlock}"> 
        <Setter Property="HorizontalAlignment" Value="Right" /> 
       </Style> 
      </DataGridTextColumn.ElementStyle> 
     </DataGridTextColumn> 
+0

Tôi đã có thể giảm thiểu mã bằng cách chỉ thêm thuộc tính ElementStyle ở bên ngoài DataGridTextColumn và có nó sử dụng CellRightAlign hiện tại của tôi. Cảm ơn. – Tod

5

Bạn có thể thử công việc xung quanh:

  <DataGridTemplateColumn> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <Grid Background="White" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
         <TextBlock HorizontalAlignment="Right" Text="{Binding Path=ImpaId}"/> 
        </Grid> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
5

Tôi vừa gặp sự cố tương tự và tìm thấy giải pháp khác bằng cách ghi đè Kiểu cho DataGridCell trong Blend.

Các mục đã thay đổi từ kiểu gốc là các bộ định vị cho VerticalAlignmentVerticalContentAlignment trong chính Style để tự kéo giãn ô và VerticalAlignment="Center"HorizontalAlignment="Right" trong thuộc tính Mẫu để căn chỉnh nội dung. Thay đổi các giá trị này thành bất kỳ thứ gì bạn cần để căn chỉnh nội dung ô.

Phần còn lại của kiểu có thể bị xóa để cài đặt từ kiểu cơ sở sẽ được sử dụng (sử dụng kiểu StaticResource là Dựa trên). Tuy nhiên tôi rời khỏi phong cách như Blend sản xuất nó.

này dẫn đến XAML-Code sau đó nên được đưa vào các nguồn lực điều khiển:

<Style TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource ResourceKey={x:Type DataGridCell}}"> 
    <Setter Property="VerticalAlignment" Value="Stretch" /> 
    <Setter Property="VerticalContentAlignment" Value="Stretch" /> 

    <!-- Additional styles, can be removed to fall back to base styles --> 
    <Setter Property="Background" Value="Transparent"/> 
    <Setter Property="BorderBrush" Value="Transparent"/> 
    <Setter Property="BorderThickness" Value="1"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DataGridCell}"> 
       <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True"> 
        <ContentPresenter 
         ContentTemplate="{TemplateBinding ContentTemplate}" 
         Content="{TemplateBinding Content}" 
         ContentStringFormat="{TemplateBinding ContentStringFormat}" 
         SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
         VerticalAlignment="Center" 
         HorizontalAlignment="Right" 
         /> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="IsSelected" Value="True"> 
      <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> 
      <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/> 
      <Setter Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> 
     </Trigger> 
     <Trigger Property="IsKeyboardFocusWithin" Value="True"> 
      <Setter Property="BorderBrush" Value="{DynamicResource {ComponentResourceKey ResourceId=FocusBorderBrushKey, TypeInTargetAssembly={x:Type DataGrid}}}"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 
9

Chỉ muốn thêm vào nhiều ví dụ cho các tìm kiếm đang trong tương lai.

tôi đặt này trong top của tập tin XAML:

<UserControl.Resources> 
    <Style TargetType="{x:Type TextBlock}" x:Key="RightCell"> 
     <Setter Property="Background" Value="{Binding Included, Converter={StaticResource BoolToColorConverter}}"/> 
     <Setter Property="HorizontalAlignment" Value="Stretch"/> 
     <Setter Property="TextAlignment" Value="Right"/> 
    </Style> 
</UserControl.Resources> 

Và sau đó trong DataGrid:

<DataGridTextColumn Header="Excluded" Binding="{Binding Excluded}" ElementStyle="{StaticResource RightCell}"/> 

Quyền này gắn văn bản và phân loại vẫn được kích hoạt. Hộp văn bản điền vào ô và trong trường hợp này được tô màu bằng công cụ chuyển đổi bool.

+0

Bài tập "ElementStyle" hoàn hảo và đơn giản. – DRapp

Các vấn đề liên quan