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.
ことに注意することが重要ですおよびフィールドのタグはここでは必須です。私はそれらなしでオブジェクトにアクセスすることができませんでした。
データバインディングのための辞書はひどいです。私はいつもそれらを疫病のように避けます。私は代わりに使用するINotifyCollectionChangedを実装するKeyedCollectionの実装を持っています。 –
Will
データバインディングで辞書が貧弱である理由を教えてください。また、実装の詳細と、それがより良い選択肢である理由を教えてください。 – Jack
WPFのコレクションベースのコントロールはすべてIEnumerablesに対して実行されるためです。また、という辞書は、IEnumerable >です。それはKVPのコレクションなので、他の問題の中でも、DataTemplatesの利点を失います。 KeyedCollection は、タイプを別のタイプにラップしません。 IEnumerable を実装しているので、WPFがコレクション、型、およびデータテンプレートをどのように扱うかを妨げるこの人工的な型はありません。 –
Will