C# 在窗口中实现IValueConverter';s代码隐藏
我正在尝试为我的C# 在窗口中实现IValueConverter';s代码隐藏,c#,wpf,xaml,ivalueconverter,C#,Wpf,Xaml,Ivalueconverter,我正在尝试为我的窗口上的一些控件定义一个转换器。我(和大多数人)通常的做法是在自己的类中定义转换器,在窗口中实例化该类的实例。参考资料,然后使用它。这种情况下的问题是转换器需要访问窗口的DataContext,因此我决定在窗口的代码隐藏中实现它: public partial class MyWindow : Window, IValueConverter { public MyWindow() { InitializeComponent();
窗口上的一些控件定义一个转换器。我(和大多数人)通常的做法是在自己的类中定义转换器,在窗口中实例化该类的实例。参考资料,然后使用它。这种情况下的问题是转换器需要访问窗口的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."
有没有办法做到这一点?我们非常感谢您的帮助
这种情况下的问题是转换器需要访问窗口的DataContext,所以我决定在窗口的代码中实现它
一个选项是使IValueConverter
成为自己的类,并像通常一样在XAML中创建实例。如果将转换器设置为DependencyObject
,则可以为UIElement
添加依赖属性,并绑定窗口(myWindow
)这将允许转换器访问窗口(通过其属性),以便获取DataContext
在此设计中,转换器可以在绑定中正常引用。我认为多值转换器可以解决您的问题:。
在您的情况下,除了SomeProperty之外,您还可以将窗口的DataContext传递给转换器并执行任何您想执行的操作。这里并不完全清楚“需要访问窗口的DataContext”是什么意思?您是指需要转换“DataContext.SomeProperty”吗?否。在Convert
和ConvertBack
方法中,我需要访问窗口的DataContext。当您将ValueConverter声明为资源时,可以设置对象的属性。您可以在ValueConverter上创建DataContext属性并进行设置。您可能必须使ValueConverter从DependencyObject继承,要做到这一点,属性可能需要是DependencyProperty。让我问另一种方法。您绑定的是什么属性(是在此窗口中还是单独的类中),您需要DataContext做什么?如何从XAML访问属性?我仍然无法使用绑定。Converter={binding ElementName=myWindow,Path=MyConverter}
失败。@PoweredByOrange我误解了您的想法-编辑以提供不同的替代方案。