在Window的代码后面实现IValueConverter

时间:2013-07-01 17:10:30

标签: c# wpf xaml ivalueconverter

我正在尝试为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."

有没有办法实现这个目标?任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:3)

  

在这种特殊情况下的问题是转换器需要访问窗口的DataContext,所以我决定在后面的窗口代码中实现它

一种选择是使IValueConverter成为自己的类,并像往常一样在XAML中创建一个实例。如果您将转换器设为DependencyObject,则可以为UIElement添加依赖项属性,并将Window(myWindow)绑定到该属性。这将允许转换器访问Window(通过它的属性)以获取DataContext。

在此设计中,转换器可以在绑定中正常引用。

答案 1 :(得分:3)

我认为MultiValueConverter可以解决您的问题:http://msdn.microsoft.com/en-us/library/system.windows.data.imultivalueconverter.aspx。 在您的情况下,在 SomeProperty 旁边,您可以将窗口的DataContext传递给转换器并执行您想要的任何操作。