WPF值转换器在重建后随机引发“方法或操作未实现”

时间:2019-11-07 15:08:03

标签: c# wpf

我的wpf应用程序中有一个值转换器,导致随机崩溃的构建。有时,应用程序正在运行,而完全更改其他内容并重建项目会使整个应用程序停止工作,并抛出

  

方法或操作未实现

如果我删除值转换器,则该应用程序每次都能正常运行。为了使其能够正常工作,有时我不得不多次清理和重建解决方案(或者从XAML中删除转换器并进行构建,然后再将其重新添加并再次构建,有时也可以)。

最让我困扰的是,它有时会工作,并且毫无理由地在重建后就停止工作。

这是我的XAML

<Window x:Class="Common.Cleanup.Views.CleanupView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:converters="clr-namespace:Common.Cleanup.Converters"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        xmlns:cal="http://www.caliburnproject.org"
        mc:Ignorable="d">
    <Window.Resources>
        <converters:IconTypeConverter x:Key="IconConverter" />
    </Window.Resources>
        ...
        <TreeView x:Name="CleanItems" Grid.Row="1" Grid.Column="1" ItemsSource="{Binding CleanupItemList}" >

            <TreeView.ItemContainerStyle>
                <Style TargetType="{x:Type TreeViewItem}">
                    <Setter Property="Focusable" Value="false" />
                </Style>
            </TreeView.ItemContainerStyle>

            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Items}">
                    <StackPanel Orientation="Horizontal">
                        <Image Margin="0,0,3,0" MinWidth="16" MinHeight="16" Source="{Binding Path=IconType, Converter={StaticResource IconConverter}}" />
                        <CheckBox IsChecked="{Binding IsChecked}" />
                        <TextBlock Text="{Binding Name}" Margin="3,0,0,0" />
                    </StackPanel>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
        ...
</Window>

和我的转换器:

public class IconTypeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var iconType = (IconType)value;

        switch (iconType)
        {
            case IconType.View:
                return FileUtility.GetBitmapImage("Shared/Icons/views.ico");
            case IconType.Schedule:
                return FileUtility.GetBitmapImage("Shared/Icons/schedules.ico");
            case IconType.Sheet:
                return FileUtility.GetBitmapImage("Shared/Icons/sheets.ico");
            case IconType.Link:
                return FileUtility.GetBitmapImage("Shared/Icons/links.ico");
        }

        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // This is not the issue. I've tried to return null without any differene
        throw new NotImplementedException();
    }
}

我正在使用x64平台的Debug配置来构建项目。

1 个答案:

答案 0 :(得分:0)

在图像绑定中添加Mode=OneWay,情况会变得更好。

赞:

<Image Margin="0,0,3,0" MinWidth="16" MinHeight="16" 
       Source="{Binding Path=IconType, Converter={StaticResource IconConverter}, Mode=OneWay}" />

这是因为在转换器的ConvertBack函数中,您已要求它引发异常。因此,每当它尝试使用UI元素的更改后的值来更新源时,都会调用ConvertBack函数,并引发您所看到的异常。

编辑

我刚刚在ConvertBack函数中看到了您的评论。我仍然建议您尝试一下我的答案。另外,请尝试返回NotSupportedException而不是返回NotImplementedException或null,以查看错误消息是否更改。