FlexGrid : WPF 콤보 컬럼 (Combo Column Type)
WPF용 플렉스 그리드에서 콤보박스형태로 데이타를 나타나게 하려면...
해당 컬럼에 ValueConverter에
1. new ColumnValueConvert( [] 타입 , false );
2. new ColumnValueConvert( Dictionary );
? 여기서 문제가 발생
코드값 Y , Name 값 Y인경우...
dic["Y" ] = "Y"; 로 해서 바인딩 시켰을 시 문제가 생긴다.
이를 해결하기 위한 방법을 아래 설명하였다.
( 삽질 신공으로 투자한 시간은 2일정도 된것 같음.. )
덕분에 바인딩을 모두 다시 공부했다...
/********************************************************************************************************
플렉스 그리드에서 기본 제공되는 컨버터로는 해결이 안된다.
예제 샘플을 보면 Dictionary로 선언해서 객체에서 받아서 넘겨주면
Key를 int로 검색하여 코드의 경우 문자열을 코드로 사용하는 경우
문제시 된다. : 예외로 지정한 캐스팅이 어쩌고 저쩌고...
이를 해결하기 위한 방법은 아래처럼 하면 된다.
1. AutoGenerateColumns = false를 준다. ( true일경우 똑같은 컬럼들이 새로 생성된다 )
2. ItemSource 속성에 {Binding} 설정
3. DataContext에 데이타 테이블을 넘겨준다.
4. 컬럼.Binding = new Binding( Path명 ); 으로 설정해준다.
5. 컬럼.ValueConverter 에 새로 만든 UsedColumnValueConvert를 넘겨주자.
: 컨버터에는 코드키와 값을 셋팅한 Dictionary<object, string>으로 구성해서 넘겨준다.
**********************************************************************************************************/
.cs
DataTable dt = new DataTable();
dt.Columns.Add("NO");
dt.Columns.Add("YN");
dt.Rows.Add(1, "Y");
dt.Rows.Add(1, "N");
Dictionary<object, string> lst = new Dictionary<object, string>();
lst["Y"] = "Y";
lst["N"] = "N";
lst["K"] = "K";
Fx.DataContext = dt;
Fx.AutoGenerateColumns = false;
Column c = new Column();
c.Binding = new Binding("NO");
Column c1 = new Column();
c1.Binding = new Binding("YN");
Fx.Columns.Add(c);
Fx.Columns.Add(c1);
Fx.Columns[1].ValueConverter = new UsedColumnValueConverter(lst);
// Fx.Rows.Add <== 하면 데이타 안늘어남. 참 뭐같음.
// 고로 원본을 꺼내 직접 Add 시켜야 함.
for (int i = 201001; i < 201012; i++)
{
DataRow dr = dt.NewRow();
foreach (Column c in dt.Columns)
{
dr[c.ColumnName] = 0;
}
dr[0] = i;
dt.Rows.Add(dr);
}
// Fx.Rows.Add(new Row()); // Row증가가 되지 않음.
.xaml
<c1Flex:C1FlexGrid Grid.Row="1" Grid.Column="2" Name="Fx" ItemsSource="{Binding}" >
c1Flex:C1FlexGrid>
여기서 필요한건 새로 만든 UsedColumnValueConverter
public class UsedColumnValueConverter : IValueConverter, IEditValueConverter
{
IDictionary<object, string> dic = null;
bool Ex = true;
public UsedColumnValueConverter(IDictionary<object, string> idic)
{
dic = idic;
}
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (dic.Keys.Contains(value))
return dic[value];
else
return value;
// return null; //널값 주면 값이 사라져버림.
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value;
// return DependencyProperty.UnsetValue;
}
public bool Exclusive
{
get { return Ex; }
}
public ICollection Values
{
get {
return dic.Values.ToList();
}
}
}
PS : 컨트롤에 대한 스터디 시간이 없으므로 다른 컨트롤로 교체됨.
'# 3) .Net ( Vs 2008 ) > WPF' 카테고리의 다른 글
WPF Textbox의 Numeric! (0) | 2015.09.05 |
---|---|
WPF 에서 Keyboard 입력 하기 Winfom SendKeys 같은.. (0) | 2011.09.08 |
IValueConverter 사용 데모 (0) | 2010.09.06 |
WPF 쓰레드 ( 프로그래스바 ) (0) | 2010.08.10 |
[WPF] Tab 순환코드 (0) | 2010.07.27 |