【问题标题】:Implementing IValueConverter in the Window's code behind在 Window 后面的代码中实现 IValueConverter
【发布时间】:2013-07-01 17:10:30
【问题描述】:

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

有没有办法做到这一点?任何帮助表示赞赏。

【问题讨论】:

  • 这里并不完全清楚——“需要访问 Window 的 DataContext”是什么意思?你的意思是你需要转换“DataContext.SomeProperty”吗?
  • 没有。在ConvertConvertBack 方法中,我需要访问窗口的DataContext。
  • 当您将 ValueConverter 声明为资源时,您可以在对象上设置属性。您可以在 ValueConverter 上创建一个 DataContext 属性并进行设置。您可能必须使 ValueConverter 从 DependencyObject 继承,并且该属性可能需要是 DependencyProperty 才能执行此操作。
  • 让我问另一种方式。你要绑定什么属性(是在这个窗口中,还是在一个单独的类中),你需要 DataContext 做什么?

标签: c# wpf xaml ivalueconverter


【解决方案1】:

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

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

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

【讨论】:

  • 如何从 XAML 访问该属性?我仍然无法使用绑定。 Converter={Binding ElementName=myWindow, Path=MyConverter} 失败。
  • @PoweredByOrange 我误解了你所追求的 - 编辑以提供不同的选择。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    相关资源
    最近更新 更多