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,所以我决定在窗口的代码中实现它

一种选择是创建IValueConverter它自己的类,并像往常一样在 XAML 中创建一个实例。如果您制作转换器 a DependencyObject,您可以为 a 添加一个依赖属性UIElement,并将 Window ( 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 回答