ListView 데이터 바인딩..

Program/C# 2008. 2. 29. 14:14

< 환경 : WPF 프로젝, VS2008 >

리스트 단위로 특정 데이터들을 보여줘야 하는 경우가 있죠..
그리드를 사용하면 편하겠지만, 아직 익숙치 않고 리스트 박스로도 충분히 가능할 듯 하여..
이번에 리스트 뷰를 사용해보았습니다.

C에서 넘어왔더니 ListView의 각 칼럼에 데이터를 바인딩 할 수가 있군요...
차근 차근 알아보겠습니다.

1. 바인딩할 데이터를 정하자.

클래스던, 구조체던 프로퍼티 요소를 바인딩 할 수가 있어 보입니다.
자세한 사항은 MSDN 검색..
클래스를 하나 정의해 보죠..
public class MyData
{
    int mA;
    int mB;
    bool mC;

}

2. 리스트뷰 칼럼 타이틀 정의
GridView Grdv = new GridView();
Lv.View = Grdv;         // 리스트뷰 내부적으로 그리드에 표현하네요..
           
GridViewColumn col = new GridViewColumn();      // 칼럼을 생성할 겁니다.
Binding Bind;             // 바인딩
MultiBinding MultiBind;  // 멀티 바인딩... 뒤에 소개하죠.

col = new GridViewColumn();
col.Header = "칼럼1";
col.Width = (double)Widths.post;    // 전 위드값을 열거형으로 정의 해놨군요..
MultiBind = new MultiBinding();
MultiBind.Bindings.Add(new Binding("mA"));  // 요렇게 프로퍼티 연결하죠?
MultiBind.Bindings.Add(new Binding("mB"));  //
MultiBind.Converter = new PostConvert();      // 컨버터 입니다. 자세한 사항은 뒤에 설명
col.DisplayMemberBinding = MultiBind;          // 바인딩 개체 컬럼에 연결하고
Grdv.Columns.Add(col); // 그리드에 컬럼 추가

col = new GridViewColumn();
col.Header = "칼럼2";
col.Width = (double)Widths.title;
col.DisplayMemberBinding = new Binding("mC");
Grdv.Columns.Add(col);

3. 자료의 추가..
여기서 바인딩된 프로퍼티를 소유하는 클래스
MyData 형 변수 data 가 있다할때
LV.Items.Add(data);
이렇게 애드하면 해당 프로퍼티 값이 추가 됩니다.

4. 바인딩
만약 data.mA = 1; data.mB = -1, data.mC = true;
이렇게 채우고 리스트 뷰에 애드 한다면 어떤 결과가 나올까요?
일단 칼럼2sms "true" 이렇게 표현될겁니다.
컬럼과 프로퍼티가 1/1로 바인딩 되었으니요..
하지만 위에 보듯이 칼럼 1에는 mA, mB 두개의 프로퍼티를 바인딩 해놨지요
보여질 컬럼은 하나이고 데이터는 2개이고.. 어떻해야 하나..?
이런 경우 컨버트 인터페이스를 사용 할 수 있습니다.

4. 컨버터
 : 실제 데이터인 프로퍼티와, 리스트 뷰에 보여지는 값사이의 데이터 변환..
MultiBind.Converter = new PostConvert();  이부분을 보시면 PstComvert 를 넘겨 주는걸 보실수 있습니다.
이 PostConvert가 IValueConverter 를 상속받아 제가 구현한 클래스 입니다.
IValueConverter를 상속받게 되면... 두개의 함수를 재정의 해줘야 하는데요..
   public object Convert(object value, Type type, object param, CultureInfo culture)
   프로퍼티값을 뷰에 표현해줄때..
   public object ConvertBack(object value, Type type, object param, CultureInfo culture)
   뷰의 값을 프로퍼티에 넣을때...

mC의값을 "true, false"가 아니니 "사용/미사용" 이런식으로 뷰에 보여주게 해주는 컨버터 입니다.
    class IsUseConvert : IValueConverter
    {
        public object Convert(object value, Type type, object param, CultureInfo culture)
        {
            String result = null;
            bool flag = (bool)value;
           
            if (str == true)
                result = "사용";
            else
                result = "미사용";

            return result;
        }
        public object ConvertBack(object value, Type type, object param, CultureInfo culture)
        {
            bool result = false;
            String Str = (String)value;

            if (Str.Equals(Properties.Resources.Uses))
                result = true
            else if (Str.Equals(Properties.Resources.UnUses))
                result = false;

            return result;
        }
    }

mA, mB의 경우 처럼 두개의 프로퍼티를 하나의 데이터로 바꿔야 하는경우..
IMultiValueConverter를 상속받은 클래스를 정의 하면됩니다.
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)

함수의 파라미터와 리턴 값을 보시면 object[] 배열임을 알 수 있습니다.
Convert 함수의 object 배열과 ConvertBack 리턴값 mA, mB의 값이... 오겠죠..?

'Program > C#' 카테고리의 다른 글

Num foramt 숫자의 출력 형식  (0) 2008.02.29
Xml 스키마, 클래스.  (0) 2008.02.29
ElementHost 윈어플과 WPF 어플간의 컨트롤 사용  (2) 2008.02.29
: