아마도 다음 달 초까지는 실버라잇2 베타2가 발표될 것 같습니다. 새로운 기능의 추가는 별로 기대하지 않고 있습니다만, 그래도 베타2에 대해 여전히 기다려지는 건 어쩔수 없네요.

그동안 글을 쓰지 못한 이유중 하나는 갑자기 눈이 안좋아져서 컴퓨터 사용시간을 줄이느라 그만큼 공부도 소흘해져서 입니다. 여러분도 건강에 신경 쓰시기 바랍니다.

이 번 글에서는 동적인 DataGrid의 구현에 대한 것으로, 위의 DataGrid에서 선택된 행의 데이터를 아래 DataGrid에 추가시켜주는 것으로, 자동적으로 add(), remove() 한 것을 반영시킬려면 INotifyCollectionChanged 를 구현해주어야 합니다.

부연 설명을 하자면, binding의 방식은 only once, one-way, two-way 가 있는데, only once는 binding 시를 기준으로 하는 것이고,  one-way 는 source에 변화가 생기면 즉시 자동적으로 target에 반영을 시켜주는 방식입니다.

one-way 가 작동하기 위해서는 Collection type에 INotifyCollectionChanged를 구현해주어야 하는데, 이런 번거러움을 제거하기 위해서, 실버라잇에서는 INotifyCollectionChanged가 구현되어 있는 Collection을 제공해주고 있는데 이것이 바로 ObservableCollection입니다.

사용자 삽입 이미지

-------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;

namespace SilverlightTwoDatagrid
{
    public partial class Page : UserControl
    {
        ObservableCollection<string> col;

        public Page()
        {
            InitializeComponent();

            dgOld.ItemsSource = "One Two Three Four Five Six".Split();
            btAdd.Click += new RoutedEventHandler(btAdd_Click);

            col = new ObservableCollection<string>();
            col.Add("Hello World!");
            dgNew.ItemsSource = col;
        }

        void btAdd_Click(object sender, RoutedEventArgs e)
        {
            col.Add(dgOld.SelectedItem.ToString());
           
            // throw new NotImplementedException();
        }
    }
}

예제소스파일첨부:

Posted by 한누리