Dynamic DataGrid (ObservableCollection, INotifyCollectionChanged)
Silverlight/Blend 2008/05/18 19:42아마도 다음 달 초까지는 실버라잇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();
}
}
}
예제소스파일첨부:
SilverlightTwoDatagrid.zip