4

ルックアップ テーブルを介して列挙値をローカライズされた文字列に変換する IValueConverter があります。正しいテーブルを見つけるには、まずテーブルの名前を知る必要があります。列挙値が Convert メソッドを介してコンバーターに渡されると、これを見つけることができます。文字列が ConvertBack メソッドを介してコンバーターに渡される場合、そうではありません (列挙型は一意ですが、文字列値は一意ではありません)。

コンバーターは、データ グリッドおよびプロパティ グリッドで使用されるエディターの DataTemplates で使用されます。

場合によっては、DataTemplate が動的に生成されるため、テーブルの名前を ConverterParameter として渡すことができます。他の場合、これを行うことはできないようです。私の現在のソリューションは、Convert メソッドでテーブル名を検索し、ConvertBack メソッドで使用するために保存します (つまり、IValueConverter は、Convert と ConvertBack の呼び出しの間で状態を維持します)。これは、Convert が常に ConvertBack の前に呼び出されることを前提としていますが、これは安全な前提とは思えません。コンバーターのバインドごとのインスタンスを使用しています。

<converters:EnumToStringConverter x:Key="EnumToStringConverter" x:Shared="False"/>

これは安全ですか、それとも私を悩ませるために戻ってきますか? コンバーター メソッドは次のようになります。

private string listName = null;

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    if (parameter == null)
    {
        parameter = ListManager.FindListNameFromObject(value);
    }
    listName = (string)parameter;
    return ListManager.GetKeyFromValue((string)parameter, value);
}

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{

    if (parameter == null)
    {
        parameter = listName;
    }
    return ListManager.GetValueFromKey((string)parameter, (string)value);
}

私が可能かどうかを確認しようとしてきた別の方法は、コンバーターに依存関係プロパティを作成し、これを何らかの方法でコレクションの名前にバインドすることです。コンバーターの DataContext を、動作しているバインディングと同じに設定する方法はありますか? 現在、コンバーターは StaticResource であるため、DataContext はありません。

ありがとう

4

2 に答える 2

5

ConvertersDependencyObject動的に変化する可能性のあるプロパティに入札を提供できないため、WPF で s にすることはできません。

以下のコードは、動的にバインドされた を使用して aKeyValue&に変換します。ValueKeyDictionary

XAML

 <StackPanel>
   <StackPanel.Resources>
      <FrameworkElement x:key="ProxyElement" 
                        DataContext="{Binding}" />
   </StackPanel.Resources>
   <ContentControl Visibility="Collapsed" 
                   DataContext="{Binding MyDictionary}"
                   Content="{StaticResource ProxyElement}" />
   <TextBox Text="{Binding Key, 
                           Converter={StaticResource MyConverter},
                           ConverterParameter={StaticResource ProxyElement}}"/>
 </StackPanel>

C#

 public class MyConverter : IValueConverter
 {
     object Convert(value, parameter ..)
     {
          var dict 
              = ((FrameworkElement)parameter).DataContext 
                  as Dictionary<string, string>)parameter;
          return (dict[value.ToString()];
     }

     object ConvertBack (value, parameter ..)
     {
        var dict 
              = ((FrameworkElement)parameter).DataContext 
                  as Dictionary<string, string>)parameter;

        foreach(var item in dict)
        {
            if (item.Value == value)
            {
                return item.Key;
            }
        }
     }
 }
于 2012-10-25T11:24:44.313 に答える
0

いつでも値を「。」にバインドできます。これにより、コンバーターに DataContext が提供され、代わりにそのオブジェクトの状態を永続化できます。

于 2012-10-25T09:51:11.007 に答える