3

ItemsSource を WCF サービスから取り込まれた CollectionViewSource に設定する ListBox があります。ListBox.ItemTemplate\DataTemplate の値コンバーターを使用して、ItemsSource のオブジェクトのプロパティを変換します。

これはすべて期待どおりに機能しますが、別のプロパティが特定の値に等しい場合を除いて、変換された値が個々のオブジェクト プロパティ値に基づくように、変換プロセスを更新する必要があります。その値は、xaml のコード ビハインドで設定されます。これは、ページ コンストラクターで設定されるフィールド レベルの変数です。

これを行うには、フィールド レベル変数を ValueConverter の ConverterParameter として渡します。私は主にこのこの質問のアイデアを使用していくつかの方法を試しましたが、xaml の解析中に常にエラーが発生します (そしてアプリの読み込みに失敗します)。

修正の 1 つは、ItemsSource のオブジェクトにプロパティを追加することかもしれませんが、実際にはそうしたくありません。部分的には、そのオブジェクトがいくつかのプロジェクトで使用されているため、i を変更したくないためです....そして、他の方法が可能かどうかを確認したいからです。また、wpfにはMultiValue Converter(およびおそらくSL 4.0)があると思いますが、SL 3.0を使用しています。

私の推測では、これまでに発生した問題は、xaml の読み込み、バインド、および解析のタイミングによるものです。

いくつか質問があります:

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

1 に答える 1

6

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

代わりに、Converter コード自体にプロパティを追加する方法をとります。

 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 リソースに追加されます。

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

UserControl コードの値を変更する必要がある場合は、次を使用します。

((ExampleConverter)Resources["conv"]).SpecialValue = someOtherVariable;
于 2010-12-09T09:16:07.020 に答える