데이터그리드를 이용해서 바로 편집 할 수 있도록 한다.

데이터그리드에서 바로 보이는 화면을 편집할떄는

프로그램은 이름과 나이를 입력하는데 이름은 콤보박스로 정해져있는사람만 선택가능하게 한다.

나이는 텍스트박스로 입력하게 한다

 

아래에서는 나이 수정 부분은 제외

 

 

적당하게 데이터 그리드를 그려주고

Person 클래스를 바인딩해주자 컬럼은 Name 과 Age를 준다.

바인딩용 클래스

  public class Person : INotifyPropertyChanged
    {
        private string _Name;

        public string Name
        {
            get
            {
                return _Name;
            }
            set
            {
                _Name = value;
                OnPropertyChanged("Name");
            }
        }
        private int _Age;

        public int Age
        {
            get
            {
                return _Age;
            }
            set
            {
                _Age = value;
                OnPropertyChanged("Age");

            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
    }

 

생성자에서 바인딩하기 (그냥 간단하게 바인딩 했따 귀찮아… ㅋ)

        private void CreatePersonDataList()
        {
            for (int i = 0; i < 10; i++)
            {
                PersonList.Add(new Person() { Name = "kojaedoo" + i.ToString(), Age = 10 + i });
            }

            ControlPersonList = new List<Person>(PersonList);

            this.dataGrid1.ItemsSource = PersonList;

        }

템플릿편집

 

 

CellTemplate 을 선택해서 우선 일반 상태일때 디자인 작업

 

 

{StaticResource NameDataTemplate}

주의!

Blend 에서 템플릿을 만들면 DynamicResource 로 만들어진다. 실제로 테스트해보면 바인딩된 데이터가 표시가 안된다.

이부분을

 

스태틱리소스로 변경해주자

Blend 에서 하면 DynamicResource  비주얼 스튜디오에서 만들면  StaticResource 으로 만들어주네…

 

그다음 위와같은방법으로  CellEditingTemplate 을 만들어서 콤보박스를 넣어준다.

 

에디트화면 진입 화면

 

소스

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Class="Com.Mariner.ERP.TestWPF.DataGridEdit"
        Title="DataGridEdit" Height="386" Width="671">
    <Window.Resources>
        <!--이름디스플레이-->
        <DataTemplate x:Key="NameDataTemplate">
            <Grid>
                    <TextBlock Text="{Binding Path=Name}" />                    
            </Grid>
        </DataTemplate>
        <!--이름클릭했을때 콤보박스로 보여주기-->
        <DataTemplate x:Key="NameEditTemplate" >

            <ComboBox Margin="0" d:LayoutOverrides="Height"  x:Name="chbName"  SelectedValue="{Binding Name}" />
            
        </DataTemplate>
        <!--나이디스플레이-->
        <DataTemplate x:Key="AgeDataTemplate">
            <Grid>
                <TextBlock Margin="0" TextWrapping="Wrap" Text="{Binding Age}"/>
            </Grid>
        </DataTemplate>
        
    </Window.Resources>
    <Grid>
        <!--PreparingCellForEdit 수정화면들어가기전 이벤트
        CellEditEnding 수정이 끝나고나서 이벤트-->
        <DataGrid AutoGenerateColumns="False" Margin="8,140,8,8" x:Name="dataGrid1" PreparingCellForEdit="dataGrid1_PreparingCellForEdit" CellEditEnding="dataGrid1_CellEditEnding">
            <DataGrid.Columns>
                <DataGridTemplateColumn  Header="Name" CellTemplate="{StaticResource NameDataTemplate}" CellEditingTemplate="{StaticResource NameEditTemplate}"  />
                <DataGridTemplateColumn Header="Age" CellTemplate="{DynamicResource AgeDataTemplate}"/>                
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

 

비하인드코드

        private void dataGrid1_PreparingCellForEdit(object sender, DataGridPreparingCellForEditEventArgs e)
        {
            string s = e.Column.Header.ToString();

            switch (s.ToLower())
            {
                case "name": //이름클릭했다면
                    ComboBox chb = VisualTreeHelper.GetChild(e.EditingElement, 0) as ComboBox; //콤보박스찾아주기
                    chb.DisplayMemberPath = "Name";
                    chb.SelectedValuePath = "Name";

                    if (chb.Items.Count <= 0) //콤보박스 데이터바인딩
                    {
                        foreach (var item in ControlPersonList)
                        {
                            chb.Items.Add(item);
                        }
                    }

                    break;

                default:
                    break;
            }
        }

        private void dataGrid1_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
        {
            //수정완료검사
            ComboBox chb = VisualTreeHelper.GetChild(e.EditingElement, 0) as ComboBox;
            Person ps = chb.SelectedItem as Person;
            if (ps == null) //콤보박스 값이 없다면 수정을 취소로 돌려주자
            {
                e.Cancel = true;
                
            }
        
       }

 

TwoWay

실제 데이터와 컨트롤에서 변경된 값을 적용할려면  Mode를 양방향으로 설정해야합니다.

참고 URL

http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=KO-KR&k=k(SYSTEM.WINDOWS.DATA.BINDING.MODE)%3bk(VS.XAMLEDITOR)%3bk(TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22)&rd=true

  • TwoWay updates the target property or the property whenever either the target property or the source property changes.

  • OneWay updates the target property only when the source property changes.

  • OneTime updates the target property only when the application starts or when the DataContext undergoes a change.

  • OneWayToSource updates the source property when the target property changes.

  • Default causes the default Mode value of target property to be used.

  • + Recent posts