2010-12-27 4 views
3

Я хотел бы добавить свой пользовательский элемент управления в столбец шаблона сетки данных.пользовательский контроль в DataGridTemplateColumn

Пользовательский элемент управления очень похож на текстовое поле, но имеет в нем значок. Пользователь может щелкнуть значок и выбрать элемент из запрашиваемого окна, затем выбранный элемент будет заполнен в текстовое поле.

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

Вот пример кода:

//Employee.cs 

    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 

    namespace SimpleGridTest 
    { 
     public class Employee 
     { 
      public string Department { get; set; } 
      public int ID { get; set; } 
      public string Name { get; set; } 
     } 
    } 

MainWindow.xaml

<Window x:Class="SimpleGridTest.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"> 
    <Grid> 
     <DataGrid x:Name="grid" Grid.Row="1" Margin="5" AutoGenerateColumns="False" 
        RowHeight="25" RowHeaderWidth="10" 
        ItemsSource="{Binding}" 
        CanUserAddRows="True" CanUserSortColumns="False"> 

      <DataGrid.Columns> 
       <DataGridTemplateColumn Header="Department" Width="150"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <TextBox Text="{Binding Department}" /> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 

       <DataGridTextColumn Header="ID" Binding="{Binding Path=ID}"          
            Width="100"/> 

       <DataGridTextColumn Header="Name" 
            Binding="{Binding Path=Name}" 
            Width="200"/> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
</Window> 

MainWindow.xaml.cs

using System.Windows; 
using System.Collections.ObjectModel; 

namespace SimpleGridTest 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     private ObservableCollection<Employee> _employees = new ObservableCollection<Employee>(); 

     public ObservableCollection<Employee> Employees 
     { 
      get { return _employees; } 
      set { _employees = value; } 
     } 

     public MainWindow() 
     { 
      InitializeComponent(); 
      grid.ItemsSource = Employees; 
     } 
    } 
} 

Как я могу исправить эту проблему? Или мне нужно написать столбец DataGrid *** как DataGridTextColumn? Заранее спасибо!

С наилучшими пожеланиями,

Джонсон

+0

Похоже, что событие CellEditEnding не запускается, когда первый столбец текстового поля потерял фокус. Это ошибка DataGrid? – Johnsonlu

ответ

4

Я думаю, вы должны указать CellEditingTemplate для редактирования и отображение содержимого вы должны указать нормальный CellTemplate

   <Controls:DataGridTemplateColumn Header="Department" Width="150"> 
       <Controls:DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding Department}" /> 
        </DataTemplate> 
       </Controls:DataGridTemplateColumn.CellTemplate> 
       <Controls:DataGridTemplateColumn.CellEditingTemplate> 
        <DataTemplate> 
         <TextBox Text="{Binding Department}"/> 
        </DataTemplate> 
       </Controls:DataGridTemplateColumn.CellEditingTemplate> 
      </Controls:DataGridTemplateColumn> 

Надеется, что это помогает ..

+0

Большое спасибо! Оно работает! – Johnsonlu

Смежные вопросы