开发者

Combobox binding in Datatemplate

Hi i am actually creating a WPF DataGrid Custom Control. What is want this combobos should show the genders in the combobox and what is heppening when i am keeping the combobox outside the datatemplate its working but inside the datatemplate it is not working. Please help me ?

<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="dat开发者_如何学编程agrid3_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;
            }
        }


    }

coding of xaml.cs file

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";
            }
        }



    }
}

So i am trying to create template column with the combobxo in the celleditingtemplate every things is working fine but inside datatemplate it is not working. Please help me? Check in the text box which i have commented it is working fine...


If you are inside a DataTemplate the DataContext will be the object that is being templated. So your binding, which is relative to the DataContext if only a binding path is specified will not find the ItemsSource.

Normally you can use a RelativeSource-binding to find the control which still has the DataContext in which your ItemsSource can be found. (See RV1987's answer; i thought it did not work earlier because if you have a DataGridComboBoxColumn the very same RelativeSource-ItemsSource-binding will not work, that is because a column on its own is abstract and does not appear in the trees unlike the control that is created by a template)

Since the DataContext of the UserControl should be what you are looking for you can name your UserControl (control for example) and bind like this:

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

(Note that x:Reference is quite new, it does not exist in .NET 3.5, using ElementName=control instead will not work)


Try using this in your datatemplate -

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

This will find the property Genders in the datacontext of your usercontrol which is DataSource.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜