2012-01-11 2 views
1

DataGrid의 ItemsSource 속성이 정수 배열 인 상황이 있습니다. 이러한 정수는 해당 사전의 키입니다. 열에 표시해야하는 것은 사전 값 개체의 멤버 인 필드입니다.WPF DataGrid - 행에 DataContext 할당

<DataGrid ItemsSource="{Binding Path=thisDataContext, ElementName=control, Mode=OneWay}" 
      AutoGenerateColumns="False">             
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Name" Width="0.3*" Binding="{Binding Converter={StaticResource IntToPersonConverter}, Mode=OneWay }" /> 
     <DataGridTextColumn Header="Department" Width="0.3*" Binding="{Binding Path=DepartmentIDX, Converter={StaticResource DepartmentConverter}, Mode=OneWay }" /> 
     <DataGridTextColumn Header="Position" Width="0.3*" Binding="{Binding Path=EmployeeTypeIDX, Converter={StaticResource EmployeeTypeConverter}, Mode=OneWay }" /> 
    </DataGrid.Columns>  
</DataGrid> 

내가 함께 일하고 있어요 클래스 사람의 목적은 속성이 - 부서 및 위치 ID를, 그래서 여러 컨버터를 구현했습니다 - 부서명 및 사람과 사람이 이름을 Postition 할 수 있습니다. 나는 그들 모두를 결합하는 방법을 모른다. DataContext 속성을 DataGrid 행에 설정할 수 있다면 가능할 것이라고 생각했습니다. 그래서 Person 객체를 Convertor에 전달할 수 있습니다.

+1

- 컬렉션 정수 또는 사람 obejcts (당신의 XAML에 의해 암시되는)의 컬렉션을? –

+0

정수 집합입니다. – tyumener

+0

{Binding}은 가능한 멀리입니다. XAML은 정수가 아니라 객체를 사용하고 있음을 의미합니다. –

답변

1

바인딩 변환기 등 WPF 선물을 실제로 사용하는 것이 효과적이라는 것을 입증하기위한 목적으로는별로 중요하지 않습니다. 변환기 호출 횟수는 엄청나게 많아서 최소한 우아하지는 않으며 쉽게 피할 수 있습니다. 그리드의 ItemsSource를 설정하기 전에 컬렉션을 사전 처리하는 것이 좋습니다.

개인적으로 LINQ projectsions을 사용하고 사전을 클래스의 정적 멤버로 설정합니다. 우리 한테 큰 소리로 말하면 샘플을 올릴거야.

업데이트 1 - 샘플 코드

public class Person 
    { 
     private static Dictionary<int, string> Departments; 

     static Person() 
     { 
      Person.SetUpDictionaries(); 
     } 

     private static void SetUpDictionaries() 
     { 
      Person.Departments = new Dictionary<int, string>(3) 
      { 
       { 1, "IT" }, 
       { 1, "Finance" }, 
       { 1, "HR" } 
      }; 
     } 

     public int DepartmentId 
     { 
      get; 
      set; 
     } 

     public string Depratment 
     { 
      get { return Person.Departments[this.DepartmentId]; } 
     } 
    } 
정확히 당신이 그리드 ItemsSource로 사용하고있는
+0

외침 : 예제 코드가 있으면 여기에 게시하면 좋습니다. – tyumener

2

항목 컬렉션이 사전에 들어있는 키 목록 인 경우 첫 번째 사전 키를 사전 값 (예 : Person 개체)으로 변환하고 두 번째 Person 개체를 Person 속성 값으로 변환하는 변환기를 작성해야합니다. 이를 위해 변환기는 사전에 액세스 할 수 있어야합니다. 다행히 WPF 값 변환기, 즉 Convert 및 ConvertBack 메서드의 변환기 매개 변수에 추가 매개 변수를 전달하는 방법이 있습니다. 여기에서 사전 개체를 전달할 수 있고, 당신의 변환 방법은 다음과 같을 수 있습니다 :

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    IDictionary<int, Person> dict = parameter as IDictionary<int, Person>; 
    if (dict != null && value is int) 
    { 
     Person p = dict[(int)value]; 
     return p.SomeProperty; 
    } 
} 

컨버터 매개 변수가 바인딩의 ConverterParameter 속성에 의해 이루어집니다 전달.

+0

코드 숨김으로 사전에 액세스 할 수 있습니다. 내가 원했던 것은 사전에 Person 객체를 검색 할 때마다 속성을 가져올 필요가 없지만 정확한 Person 객체를 id 대신 변환기로 전달하는 것입니다. ConverterParameter를 (주) 주셔서 감사합니다. ConverterParameter에서 Person 객체에 Binding을 사용하려고 시도했지만 가능하지 않습니다. – tyumener