2010-12-08 17 views
3

ItemsSourceをWCFサービスから実装されたCollectionViewSourceに設定するListBoxがあります。 ItemsSource内のオブジェクトのプロパティを変換するには、ListBox.ItemTemplate \ DataTemplateの値コンバータを使用します。ValueConverterのConverterParameterへの入力としてcodebehind変数を使用する方法

これはすべて正常に動作しますが、異なるプロパティが特定の値と等しい場合を除いて、変換された値が個々のオブジェクトプロパティ値に基づいているように変換プロセスを更新する必要があります。その値は、xamlのコードの背後に設定されます。これは、ページコンストラクタで設定されたフィールドレベルの変数です。

これを行うには、フィールドレベル変数をValueConverterのConverterParameterとして渡します。私はxamlを解析する際にエラーが発生する(そしてアプリケーションが読み込まれない)ことを除いて、主にこのthis questionのアイデアを使用していくつかの方法を試しました。

1つの問題は、ItemsSource内のオブジェクトにプロパティを追加する可能性がありますが、実際にはそうしたくありません。そのオブジェクトはいくつかのプロジェクトで使用されているので、私は私が....私は....変更したくないので、私は他の方法も可能であるかどうかを見たいので。また、私はwpfがMultiValue Converter(そしておそらくSL 4.0)を持っていると信じていますが、私はSL 3.0を使っています。

xamlの読み込み、バインディング、および解析のタイミングのために、これまでの問題が私の推測です。

だから、いくつかの質問:私は上記のように、これは

  • を行うことができますか?
  • 問題がない場合はどうなりますか?
  • オブジェクトにプロパティを追加しないと別の方法がありますか?

答えて

5

この場合、バインドConverterParameterを使用したいと思うように聞こえません。私が正しく理解していれば、このパラメータに割り当てたいUserControlレベルで単一の値が保持されているため、すべてのインスタンスのパラメータ値は同じになります。

代わりに、コンバーターコード自体にプロパティを追加する方法があります。

public class ExampleConverter : IValueConverter 
{ 

    public int SpecialValue { get; set; } 

    public override object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value != null) 
     { 
      if (value.Equals(SpecialValue)) 
       return "Special!"; 
      else 
       return value.ToString(); 
     } 
     else 
     { 
      return null; 
     } 
    } 

    public override object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

今、あなたはこのコンバータは、ユーザーコントロールのリソースに追加したと思います: -

<UserControl.Resources> 
    <local:ExampleConverter x:Key="conv" SpecialValue="-1" /> 
</UserControl.Resources> 

あなたが使用するユーザーコントロールのコード内で値を変更する必要がある場合: -

((ExampleConverter)Resources["conv"]).SpecialValue = someOtherVariable; 
+0

をこの作品をありがとう、私は私のテストで私の問題のいくつかは、私はコンバータをリソースとしてUserControlではなくメイングリッドに置いていたという事実であると思われる。 –

関連する問題