我有一个DataGrid
,它有一个DataGridCheckBox
列。我需要在DataGrid
的所有行中显示这样的复选框:
以下是XAML和相应的代码:
<!--MainWindow.xaml-->
<Window x:Class="DataGridColIssue.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
Height="350"
Width="525"
Loaded="Window_Loaded">
<Window.Resources>
<Style x:Key="RowNumberCheckBox" TargetType="CheckBox" BasedOn="{StaticResource {x:Type CheckBox}}">
<Setter Property="FlowDirection" Value="RightToLeft"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="Content">
<Setter.Value>
<Grid FlowDirection="LeftToRight">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="20"/>
<ColumnDefinition Width="5"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding Number, StringFormat={}{0:00}}"/>
</Grid>
</Setter.Value>
</Setter>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="30"/>
</Grid.RowDefinitions>
<DataGrid Grid.Row="0"
Name="DataGridTesting"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridCheckBoxColumn Header="#"
Binding="{Binding Exclude, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"
ElementStyle="{StaticResource RowNumberCheckBox}"
EditingElementStyle="{StaticResource RowNumberCheckBox}">
</DataGridCheckBoxColumn>
</DataGrid.Columns>
</DataGrid>
<Button Grid.Row="1"
Name="AddItems"
Content="Add Item"
Click="AddItems_Click"/>
</Grid>
</Window>
代码
//MainWindow.xaml.cs
using System.Collections.Generic;
using System.Windows;
namespace DataGridColIssue
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public int CurrentOperation;
public List<Operation> Operations;
public MainWindow()
{
InitializeComponent();
Operations = new List<Operation>();
CurrentOperation = 0;
}
private void AddItems_Click(object sender, RoutedEventArgs e)
{
CurrentOperation++;
Operations.Add(new Operation(CurrentOperation));
DataGridTesting.Items.Refresh();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
DataGridTesting.ItemsSource = Operations;
DataGridTesting.Items.Refresh();
}
}
}
操作类
namespace DataGridColIssue
{
public class Operation
{
public bool Exclude { get; set; }
public int Number { get; set; }
public Operation(int Number)
{
this.Number = Number;
}
}
}
我只是最后一个添加行的问题是在CheckBox
之前的文本中显示的,它看起来像这样:
如何在复选框之前显示所有行以显示数字?
答案 0 :(得分:1)
用作内容的网格实例由所有checkBox共享。但它不能有多个父级,所以它在最后一个复选框中显示。
正确的方法是设置ContentTemplate(此问题的修改示例:Text on the left side of checkbox in WPF?,nmclean的答案)
<Style x:Key="RowNumberCheckBox" TargetType="CheckBox"
BasedOn="{StaticResource {x:Type CheckBox}}">
<Setter Property="Content" Value="{Binding Number}"/>
<Setter Property="ContentStringFormat" Value="00"/>
<Setter Property="FlowDirection" Value="RightToLeft" />
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<ContentControl Content="{Binding}"
ContentStringFormat="{TemplateBinding ContentStringFormat}" />
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
当FlowDirection是RightToLeft并检查CheckBox时,您是否注意到复选标记被翻转?
我对给定需求的首选解决方案是DataGridTemplateColumn而不是DataGridCheckBoxColumn,或者是带有text和checkBox的自定义RowHeaderTemplate。
答案 1 :(得分:0)