пользовательский элемент управления в DataGridTemplateColumn - PullRequest
3 голосов
/ 27 декабря 2010

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

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

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

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

 //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?Заранее спасибо!

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

Джонсон

1 Ответ

5 голосов
/ 27 декабря 2010

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

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

Надеюсь, это поможет ..

...