3

の一部のコントロールのコンバーターを定義しようとしていますWindow。私(およびほとんどの人)が通常行う方法は、独自のクラスでコンバーターを定義し、そのクラスのインスタンスをインスタンス化してWindow.Resourcesから使用することです。この特定のケースの問題は、コンバーターがウィンドウの にアクセスする必要があることですDataContext。そのため、ウィンドウのコード ビハインドにそれを実装することにしました。

public partial class MyWindow : Window, IValueConverter
{
    public MyWindow()
    {
        InitializeComponent();

        // Other operations  
    }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        // Access the DataContext and return a value
        return new object();
    }

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

問題は、XAML での使用方法がわからないことです。データ コンテキストが失われるため、明らかに、このクラスの新しいインスタンスをインスタンス化したくありません。私は試した

"{Binding ElementName=someElement, Path=SomeProperty, Converter={Binding ElementName=myWindow}"

myWindowこのウィンドウの名前はどこにありますか。次のような実行時エラーが発生します。

"A 'Binding' cannot be set on the 'Converter' property of type 'Binding'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject."

これを達成する方法はありますか?どんな助けでも大歓迎です。

4

2 に答える 2

3

この特定のケースの問題は、コンバーターがウィンドウの DataContext にアクセスする必要があることです。そのため、ウィンドウのコード ビハインドにそれを実装することにしました。

1 つのオプションは、IValueConverter独自のクラスを作成し、通常どおり XAML でインスタンスを作成することです。コンバーターを にするDependencyObjectと、 の依存関係プロパティを追加し、ウィンドウ ( ) をプロパティにUIElementバインドできます。myWindowこれにより、DataContext をフェッチするために、コンバーターが (そのプロパティを介して) ウィンドウにアクセスできるようになります。

この設計では、バインディング内でコンバーターを通常どおり参照できます。

于 2013-07-01T17:13:41.237 に答える
3

MultiValueConverter で問題を解決できると思います: http://msdn.microsoft.com/en-us/library/system.windows.data.imultivalueconverter.aspx。あなたの状況では、SomePropertyのほかに、ウィンドウの DataContext をコンバーターに渡して、好きなことをすることができます。

于 2013-07-01T17:23:58.553 に答える