Связывание Combobox в Datatemplate - PullRequest
0 голосов
/ 29 апреля 2011

Привет, я на самом деле создаю пользовательский элемент управления WPF DataGrid. Что нужно, чтобы эти комбо-списки отображали пол в комбо-боксе и что происходит, когда я держу комбо-бокс вне таблицы данных, ее работа, но внутри таблицы данных она не работает. Пожалуйста, помогите мне?

<UserControl x:Class="Custom_DataGrid.Grid3.Grid3"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" xmlns:sdk="http://schemas.microsoft.com/wpf/2008/toolkit"
             d:DesignHeight="300" d:DesignWidth="300" >
    <UserControl.Resources>

        <DataTemplate x:Key="dueDateCellTemplate">
            <TextBlock Text="{Binding DOB}" Margin="5,4,5,4"/>
        </DataTemplate>
        <DataTemplate x:Key="dueDateCellEditingTemplate">
            <DatePicker SelectedDate="{Binding DOB, Mode=TwoWay}"/>
        </DataTemplate>

        <DataTemplate x:Key="genderCellTemplate">
            <TextBlock Text="{Binding GENDER.Gender}" Margin="5,4,5,4"/>
        </DataTemplate>
        <DataTemplate x:Key="genderCellEditingTemplate">
            <!--<ComboBox ItemsSource="{Binding Genders}" SelectedItem="{Binding Genders}" SelectedValue="{Binding Path=GENDER, ElementName=Id}" DisplayMemberPath="Id" SelectedValuePath="Gender"></ComboBox>-->
            <ComboBox x:Name="c1" ItemsSource="{Binding Genders}" DisplayMemberPath="Id"  Height="50" Width="100"></ComboBox>
            <!--<TextBlock Text="{Binding Genders.Gender}" Foreground="Khaki"></TextBlock>-->
        </DataTemplate>

    </UserControl.Resources>
    <Grid>
        <DataGrid x:Name="datagrid3" AutoGeneratingColumn="datagrid3_AutoGeneratingColumn" ItemsSource="{Binding Employees}" Foreground="SteelBlue"></DataGrid>

    </Grid>
</UserControl>
public enum Designation
    {
        Sales, Development, HR, BackOffice
    }

public class Sex
    {
        private string id;
        private string gen;

        public string Id
        {
            get
            {
                return id;
            }
            set
            {
                id = value;
            }
        }

        public string Gender
        {
            get
            {
                return gen;
            }
            set
            {
                gen = value;
            }
        }

    }

public class DataSource
    {
        ObservableCollection<Employee> empList = new ObservableCollection<Employee>();
        List<Sex> genders = new List<Sex>();



        public DataSource()
        {

            empList.Add(new Employee() { ID = 1, NAME = "Neeraj", DOB = Convert.ToDateTime("12/03/1986"), EMAIL = "neeraj@mail.com", GENDER = new Sex() { Id = "M", Gender = "Male" }, PHONE = "9999999999", ACTIVE = false, DESIGNATION = Designation.Development });
            empList.Add(new Employee() { ID = 2, NAME = "Mayank", DOB = Convert.ToDateTime("01/01/1986"), EMAIL = "mayank@mail.com", GENDER = new Sex() { Id = "M", Gender = "Male" }, PHONE = "9999999999", ACTIVE = true, DESIGNATION = Designation.BackOffice });
            empList.Add(new Employee() { ID = 1, NAME = "Neeraj", DOB = Convert.ToDateTime("12/03/1986"), EMAIL = "neeraj@mail.com", GENDER = new Sex() { Id = "M", Gender = "Male" }, PHONE = "9999999999", ACTIVE = false, DESIGNATION = Designation.Development });
            empList.Add(new Employee() { ID = 2, NAME = "Mayank", DOB = Convert.ToDateTime("01/01/1986"), EMAIL = "mayank@mail.com", GENDER = new Sex() { Id = "M", Gender = "Male" }, PHONE = "9999999999", ACTIVE = true, DESIGNATION = Designation.BackOffice });
            empList.Add(new Employee() { ID = 1, NAME = "Neeraj", DOB = Convert.ToDateTime("12/03/1986"), EMAIL = "neeraj@mail.com", GENDER = new Sex() { Id = "M", Gender = "Male" }, PHONE = "9999999999", ACTIVE = false, DESIGNATION = Designation.Development });
            empList.Add(new Employee() { ID = 2, NAME = "Mayank", DOB = Convert.ToDateTime("01/01/1986"), EMAIL = "mayank@mail.com", GENDER = new Sex() { Id = "M", Gender = "Male" }, PHONE = "9999999999", ACTIVE = true, DESIGNATION = Designation.BackOffice });

            genders.Add(new Sex() { Id = "M", Gender = "Male" });
            genders.Add(new Sex() { Id = "F", Gender = "Female" });


        }




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

        public List<Sex> Genders
        {
            get
            {
                return genders;
            }
            set
            {
                genders = value;
            }
        }


    }

кодирование файла xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;




namespace Custom_DataGrid.Grid3
{
    /// <summary>
    /// Interaction logic for Grid3.xaml
    /// </summary>
    public partial class Grid3 : UserControl
    {
        public Grid3()
        {
            InitializeComponent();
            this.DataContext = new DataSource();
        }

        private void datagrid3_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            if (e.PropertyName.ToLower().ToString().Equals("id"))
            {
                e.Column.Header = "Employee Id";
            }
            else if (e.PropertyName.ToLower().Equals("name"))
            {
                e.Column.Header = "Employee Name";
            }
            else if (e.PropertyName.ToLower().Equals("dob"))
            {
                e.Column.Header = "Employee DOB";
                if (e.PropertyType == typeof(DateTime))
                {
                    DataGridTemplateColumn templateColumn = new DataGridTemplateColumn();
                    templateColumn.Header = "Employee DOB";
                    templateColumn.CellTemplate = (DataTemplate)Resources["dueDateCellTemplate"];
                    templateColumn.CellEditingTemplate = (DataTemplate)Resources["dueDateCellEditingTemplate"];
                    templateColumn.SortMemberPath = "DueDate";
                    e.Column = templateColumn;
                }
            }
            else if (e.PropertyName.ToLower().Equals("phone"))
            {
                e.Column.Header = "Employee Phone";
                e.Cancel = true;
            }
            else if (e.PropertyName.ToLower().Equals("email"))
            {
                e.Column.Header = "Employee Email";
            }
            else if (e.PropertyName.ToLower().Equals("gender"))
            {
                e.Column.Header = "Employee Gender";
                DataGridTemplateColumn templateColumn = new DataGridTemplateColumn();
                templateColumn.Header = "Employee Gender";
                templateColumn.CellTemplate = (DataTemplate)Resources["genderCellTemplate"];
                templateColumn.CellEditingTemplate = (DataTemplate)Resources["genderCellEditingTemplate"];
                e.Column = templateColumn;
            }
            else if (e.PropertyName.ToLower().Equals("active"))
            {
                e.Column.Header = "Employee Active/InActive";
            }
            else if (e.PropertyName.ToLower().Equals("designation"))
            {
                e.Column.Header = "Employee Designation";
            }
        }



    }
}

Итак, я пытаюсь создать шаблонный столбец с combobxo в шаблоне cellediting, все работает нормально, но внутри шаблона данных он не работает. Пожалуйста, помогите мне? Отметьте в текстовом поле, которое я прокомментировал, оно работает нормально ...

Ответы [ 2 ]

3 голосов
/ 29 апреля 2011

Если вы находитесь внутри DataTemplate, DataContext будет объектом, который подвергается шаблону.Таким образом, ваша привязка, которая относится к DataContext, если указан только путь привязки, не найдет ItemsSource.

Обычно вы можете использовать привязку RelativeSource, чтобы найти элемент управления, в котором еще есть DataContext, в которомВаш ItemsSource может быть найден.( См. Ответ RV1987; я думал, что он не работал раньше, потому что если у вас DataGridComboBoxColumn то же самое RelativeSource-ItemsSource-binding, не будет работать , потому что сам по себе столбецабстрактный и не отображается в деревьях в отличие от элемента управления, созданного шаблоном )

Поскольку DataContext элемента UserControl должен быть тем, что вы ищете, вы можете назвать свой UserControl (control дляпример) и выполните привязку следующим образом:

ItemsSource="{Binding Source={x:Reference control}, Path=DataContext.Genders}"

(обратите внимание, что x:Reference является довольно новым, его не существует в .NET 3.5, вместо него будет использоваться ElementName=control не работа)

0 голосов
/ 29 апреля 2011

Попробуйте использовать это в своей таблице данных -

<ComboBox x:Name="c1" ItemsSource="{Binding DataContext.Genders, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" DisplayMemberPath="Id"  Height="50" Width="100"></ComboBox>

Это найдет свойство Genders в текстовом контенте вашего пользовательского элемента управления, который является DataSource.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...