2016-06-07 3 views
0

У меня есть DataGrid и он имеет столбец DataGridCheckBox. И мне нужно, чтобы представить этот флажок, как это во всех строках DataGrid:DataGridCheckBoxColumn с текстом перед флагом

enter image description here

И Ниже приведен 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 и это выглядит следующим образом:

enter image description here

Как я могу получить все строки для отображения номера, как задолго до отметки?

ответ

1

Сетчатый экземпляр, используемый в качестве Контента, разделяемого всеми checkBoxes. Но у него не может быть более одного родителя, поэтому он заполняется последним 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 или, может быть, пользовательский RowHeaderTemplate с текстом и checkBox.

0

После решения, предоставленного @Ash, сделал Grid как часть ContentTemplate, а затем установить contentvalue, это сделало экземпляр Grid быть создано для каждой строки, здесь этого решения, которое производит желаемый результат:

<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="Margin" Value="5"/> 
     <Setter Property="ContentTemplate"> 
      <Setter.Value> 
       <DataTemplate> 
        <Grid FlowDirection="LeftToRight"> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="20"/> 
          <ColumnDefinition Width="5"/> 
         </Grid.ColumnDefinitions> 
         <TextBlock Grid.Column="0" 
            Text="{Binding}" 
            HorizontalAlignment="Right"/> 
        </Grid> 
       </DataTemplate> 
      </Setter.Value> 
     </Setter> 
     <Setter Property="Content" Value="{Binding Number}"/> 
     <Setter Property="HorizontalContentAlignment" Value="Center"/> 
     <Setter Property="VerticalContentAlignment" Value="Center"/> 
    </Style> 

enter image description here