2010-12-27 3 views
3

カスタムコントロールをデータグリッドのテンプレート列に追加したいと思います。DataGridTemplateColumnのカスタムコントロール

カスタムコントロールはテキストボックスと非常によく似ていますが、アイコンがあります。ユーザーはアイコンをクリックし、プロンプトウィンドウからアイテムを選択すると、選択したアイテムがテキストボックスに入力されます。

私の問題は、テキストボックスがいっぱいになったときに、2番目の列をクリックするとテキストが消えてしまうことです。カスタムコントロールを単純なテキストボックスに置き換えると、結果は同じになります。ここで

はサンプルコードです:

//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

は私が..

をあなたはこのことができます通常の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> 

希望を指定する必要が編集にCellEditingTemplateを指定すると、コンテンツを表示する必要が推測します

+0

ありがとう!できます! – Johnsonlu