2012-01-11 10 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> 

私が働いているPersonクラスのオブジェクトは、プロパティがある - 部門と位置idを、私は、複数のコンバータを実装しました - 部署名と、人が名前をPostitionします。私はそれらのすべてをどのように組み合わせるか分かりません。私はDataGridの行にDataContextプロパティを設定できる場合、それが可能であると考えました。だから私はConvertorにPersonオブジェクトを渡すことができました。

+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オブジェクトと2番目のPersonオブジェクトからPersonプロパティ値に変換するコンバータを作成する必要があります。これを実現するには、コンバーターが辞書にアクセスできる必要があります。幸いなことに、WPF値コンバータに追加のパラメータ、つまりConvertメソッドとConvertBackメソッドのconverterパラメータを渡す方法があります。ここでは、辞書オブジェクトを渡すことができますし、あなたの変換方法は、次のようになります。

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オブジェクトに使用しようとしましたが、不可能です。 – tyumener

関連する問題