转换器不能应用于需要IValueConverter类型的属性

问题描述 投票:3回答:4

我有一个转换器,它实现IValueConverter但不能绑定到属性。

public class StatusToBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return Brushes.Red;
    }

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

}

在XAML中,我将转换器添加为资源,并将绑定添加到Element

<UserControl.Resources>
    <Converters:StatusToBrushConverter x:Key="StatusConverter"/>
</UserControl.Resources>            

<Rectangle Fill="{Binding Status, Converter={StaticResource StatusConverter}, ElementName=userControl}"/>

但我不断得到错误

“StatusToBrushConverter”类型的对象不能应用于期望类型为“System.Windows.Data.IValueConverter”的属性

但转换器实现了接口IValueConverter。我尝试了几件事:

  • 重建,清理,构建,构建解决方案等
  • 全新转换器 - >相同

以前编写的转换器工作。思考?

c# wpf xaml binding converters
4个回答
3
投票

确保您的StatusToBrushConverter类通过使用其完全限定的名称真正实现了正确的IValueConverter接口:

public class StatusToBrushConverter : System.Windows.Data.IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return Brushes.Red;
    }

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

您还可以尝试临时使用property元素语法进行调试:

<Rectangle>
    <Rectangle.Fill>
        <Binding Path="Status" ElementName="userControl">
            <Binding.Converter>
                <local:StatusToBrushConverter />
            </Binding.Converter>
        </Binding>
    </Rectangle.Fill>
</Rectangle>

2
投票

将以前编写的工作转换器设置在xaml文件中,以查看问题是否仍然存在,并将问题隔离到xaml(或您编写的转换器)。


0
投票

解决方案如下:转换器位于类库中。应该不是问题而且对于其他转换器没问题。但我在WPF项目中移动了转换器,现在它工作了。我没有更改转换器中的任何内容。

今天早上打开电脑时,错误信息的初始错误消失了。视觉工作室的几次重启是不够的。只是PC重启就行了。

谢谢你的提议。我尝试了所有这些。


-2
投票

作为转换器的替代,可以在VM上创建关联的Notified属性以提供所讨论的颜色。

例如,假设你的颜色实际上是另一个名为IsValid的通知属性。当IsValid改变时,它应该改变矩形的颜色。

 private bool _isValid;

 public bool IsValid
 {
     get { return _IsValid; }
     set 
     {
         _isValid = value;
         NotifyPropertyChanged("IsValid");
         NotifyPropertyChanged("UserStatusColor");
     }
 }


 public Brush UserStatusColor
 {
     get { return IsValid ? Brushes.Green : Brushes.Red; }
 }

….

<Rectangle Fill="{Binding UserStatusColor}"/>

因此,颜色的变化,而不必特洛伊木马转换器进入过程。

© www.soinside.com 2019 - 2024. All rights reserved.