2017-12-01 20 views
0

this oneなどの他のいくつかの質問を使用します。私は次のように、XAMLからDictionary<Enum, string>にバインドする方法を発見した:私はDataTemplateを導入し、EnumValueの代わりに、オブジェクトデータプロパティを使用しようとしたらDataTemplateオブジェクトをキーとして使用するDictionary <Enum、string>へのデータバインディング

{Binding Path=Dictionary[ (namespace:EnumModel) EnumValue ]} 

しかし、私の問題が発生します。私はこのような何かを達成しようとしている:私はより適切なフォーマットでstring値にEnumプロパティを変換し、ダイナミックなレイアウトのために、このアプローチを使用しています

{Binding Path=Dictionary[ (namespace:EnumModel) ObjectDataProperty ]} 

、任意の助けをいただければ幸いです。

ANSWER:パベルに

おかげで、ここでは、最終的な製品です:

XAML:

<MultiBinding Converter="{StaticResource DictionaryAccessor}"> 
    <Binding Path="DataContext.Dictionary" RelativeSource="{RelativeSource AncestorType=UserControl}"/> 
    <Binding Path="Data.ObjectProperty"/> 
</MultiBinding> 

コンバータ:

public class DictionaryAccessor : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     var dict = values[0] as Dictionary<EnumModel, string>; 
     var key = values[1] as EnumModel?; 

     return key != null && dict != null ? dict[key.Value] : null; 
    } 
} 

それは、Data.ことに注意することが重要ですおよびフィールドのタグはここでは必須です。私はそれらなしでオブジェクトにアクセスすることができませんでした。

+1

データバインディングのための辞書はひどいです。私はいつもそれらを疫病のように避けます。私は代わりに使用するINotifyCollectionChangedを実装するKeyedCollection の実装を持っています。 – Will

+0

データバインディングで辞書が貧弱である理由を教えてください。また、実装の詳細と、それがより良い選択肢である理由を教えてください。 – Jack

+1

WPFのコレクションベースのコントロールはすべてIEnumerablesに対して実行されるためです。また、という辞書は、IEnumerable >です。それはKVPのコレクションなので、他の問題の中でも、DataTemplatesの利点を失います。 KeyedCollection は、タイプを別のタイプにラップしません。 IEnumerable を実装しているので、WPFがコレクション、型、およびデータテンプレートをどのように扱うかを妨げるこの人工的な型はありません。 – Will

答えて

1

リテラル値のみをパスのインデクサに渡すことができます。 いくつかのプロパティの値をキーとして辞書からアイテムを動的に選択する場合は、MultiBindingを使用してそのアイテムを実現できます。

<MultiBinding Converter="{StaticResource DictionaryAccessor}"> 
    <Binding Path="Dictionary" /> 
    <Binding Path="ObjectDataProperty" /> 
</MultiBinding> 

DictionaryAccessorあなたが要素にアクセスするために記述する必要がありIMultiValueConverterようです。その変換方法は次のようになります。

var dict = values[0] as IDictionary<EnumModel, SomeType>; // Replace SomeType with your real object type. 
var key = values[1] as EnumModel?; 
return key != null ? dict[key.Value] : null; 
+0

偉大な答え、私は 'IMultiValueConverter'の使用を考えていませんでした。 – Jack