【问题标题】:Converter cannot be applied to a property that expects the type IValueConverter转换器不能应用于需要 IValueConverter 类型的属性
【发布时间】:2019-08-30 20:20:45
【问题描述】:

我有一个转换器,它实现了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。我尝试了几件事:

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

以前编写的转换器可以工作。想法?

【问题讨论】:

  • 您的问题中的“xx”是什么?这有点重要...
  • @canton7 可能是StatusToBrushConverter
  • @Danis 可能是这样,但这没有意义,因为StatusToBrushConverter 实现了IValueConverter,正如问题所指出的那样。如果是其他原因,那就是调查的起点。
  • 如果您忘记在转换器定义中添加: IValueConverter,通常会出现该消息。
  • 另外,确保StatusToBrushConverter 声明中的IValueConverter 接口实际上是System.Windows.Data.IValueConverter,而不是您意外创建的另一个空接口(如果您使用@987654332,很容易做到@ 为未知类型自动添加using 语句,并意外选择创建新接口)。右键单击IValueConverter 和“转到定义”

标签: c# wpf xaml binding converters


【解决方案1】:

确保您的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();
    }
}

您也可以尝试临时使用属性元素语法进行调试:

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

【讨论】:

  • (如 cmets 中所述,很容易意外创建自己的 IValueConverter 接口,而不是让 Intellisense 添加 using System.Windows.Data;。这是消除这种可能性的好方法)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    今天早上我打开电脑时,带有错误消息的初始错误消失了。几次重新启动视觉工作室是不够的。只需重启电脑就可以了。

    感谢您的建议。我都试过了。

    【讨论】:

      【解决方案4】:

      作为转换器的替代方案,可以在 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}"/>
      

      因此颜色会发生变化,而无需在进程中安装木马转换器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-28
        • 2022-11-16
        • 1970-01-01
        • 1970-01-01
        • 2021-02-13
        • 1970-01-01
        • 2010-11-13
        相关资源
        最近更新 更多