无法将Converter应用于期望类型为IValueConverter

时间:2019-04-09 13:52:08

标签: c# wpf xaml binding converters

我有一个实现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中,我将转换器添加为资源,并向元素添加了绑定

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

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

但是我不断收到错误消息

  

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

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

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

以前编写的转换器起作用。有想法吗?

4 个答案:

答案 0 :(得分: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>

答案 1 :(得分:2)

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

答案 2 :(得分:0)

解决方案如下:Converter在类库中。应该不会有问题,并且对于其他转换器也没有问题。但是我在WPF项目中移动了Converter,现在它可以工作了。我没有在Converter中进行任何更改。

今天早晨打开计算机时,带有错误消息的初始错误消失了。 Visual Studio的几次重新启动还不够。只是PC重新启动就可以了。

谢谢您的建议。我尝试了所有这些。

答案 3 :(得分:-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}"/>

因此,颜色变化无需将特洛伊木马程序转换成该过程。