运行时错误:未找到 InverseBooleanConverter

Posted

技术标签:

【中文标题】运行时错误:未找到 InverseBooleanConverter【英文标题】:Run-time error: InverseBooleanConverter not found 【发布时间】:2013-10-22 21:05:59 【问题描述】:

我在尝试遵循以下建议时遇到问题: How to bind inverse boolean properties in WPF?

当我与 ResourceDictionary 一起使用时,它会给出运行时错误。未找到 InverseBooleanConverter。

XMAL如下:

<UserControl x:Class="SMTF.MasterDataView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:SMTF" mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" d:DesignHeight="466" d:DesignWidth="483">
<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="../AppResource.xaml" />
            <ResourceDictionary Source="../DefaultStyle.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>
    <Grid>
    <StackPanel  HorizontalAlignment="Left" Margin="200,12,0,0" Name="stkMain" VerticalAlignment="Top" >
        <Grid Margin="4">
            <ContentControl Visibility="Binding IsChecked, ElementName=VisibilityToggle, Converter=StaticResource InverseBooleanConverter" >
                <Border Grid.Column="2" Style="StaticResource MainBorderStyle">
                    <HeaderedContentControl   Content="Binding Path=WorkspaceView" ContentTemplate="StaticResource WorkspacesTemplate" Header="View" Style="StaticResource MainHCCStyle"/>
                </Border>
            </ContentControl>
        </Grid>
        <Grid DockPanel.Dock="Bottom" Margin="0,2,4,2">
            <TextBlock HorizontalAlignment="Right">

               <ToggleButton  x:Name="VisibilityToggle" Focusable="False" Style="StaticResource SMToggle"  Command ="Binding ShowNew" >

                </ToggleButton>
               <!--<ToggleButton x:Name="VisibilityToggle"   Background="Transparent" Command ="Binding ShowNew" >
                     <Image Source="/Image/Add.png"  Width="24" />
                </ToggleButton>-->
            </TextBlock>

        </Grid>

        <Grid Margin="4">
            <ContentControl Visibility="Binding IsChecked, ElementName=VisibilityToggle, Converter=StaticResource BoolToVisibility" >
            <Border Grid.Column="2" Style="StaticResource MainBorderStyle">
                <HeaderedContentControl  Content="Binding Path=WorkspaceEdit" ContentTemplate="StaticResource WorkspacesTemplate" Header="Configure" Style="StaticResource MainHCCStyle"/>
            </Border>
            </ContentControl>
        </Grid>
    </StackPanel>

</Grid>
</UserControl>

我使用的是链接中提供的相同代码。 即:

[ValueConversion(typeof(bool), typeof(bool))]
public class InverseBooleanConverter: IValueConverter

    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    
        if (targetType != typeof(bool))
            throw new InvalidOperationException("The target must be a boolean");

        return !(bool)value;
    

    public object ConvertBack(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    
        throw new NotSupportedException();
    

    #endregion

在 AppResource XML 中

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:vm="clr-namespace:SMTF">
 <vm:InverseBooleanConverter x:Key="InverseBoolToVisibility" /> 
 .....
 .....
</ResourceDictionary>

提前致谢 NS

【问题讨论】:

请分享您尝试过的代码/xaml。您如何定义转换器以及如何引用它 @nit 我已经添加了请求的信息 【参考方案1】:

样式相关绑定的转换器的替代方法是使用 Style.Triggers,下面显示了当复选框 IsChecked = false 时的画布,否则将需要 InverseBooleanConverter。

<Canvas x:Name="Overlay">
    <Canvas.Style>
        <Style TargetType="Canvas">
            <Style.Triggers>
                <DataTrigger Binding="Binding IsChecked, ElementName=MyCheckbox" Value="True">
                    <Setter Property="Visibility" Value="Collapsed" />
                </DataTrigger>
                <DataTrigger Binding="Binding IsChecked, ElementName=MyCheckbox" Value="False">
                    <Setter Property="Visibility" Value="Visible" />
                </DataTrigger>                                
            </Style.Triggers>
        </Style>
    </Canvas.Style>
    <Rectangle Canvas.ZIndex="3" Fill="#99333333" Height="25" Stroke="Transparent" Width="293" Canvas.Left="10" Canvas.Top="-25"/>
</Canvas>

【讨论】:

我正在寻找仅适用于 xaml 的解决方案,就是这样!【参考方案2】:

您使用的密钥不正确。您的资源键是InverseBoolToVisibility,而您使用 InverseBooleanConverter 作为键。

更改资源键以将正确的资源引用为

<ContentControl Visibility="Binding IsChecked, ElementName=VisibilityToggle, Converter=StaticResource InverseBoolToVisibility" >

您对转换器的实现也是错误的。如果您想根据布尔逆值更改可见性,请将您的转换器代码更新为:

public class InverseBooleanConverter: IValueConverter

    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    
        if (targetType != typeof(Visibility))
            throw new InvalidOperationException("The target must be a boolean");

        if(!(bool)value)
        
            return Visibility.Visible;
        
        return Visibility.Collapsed;
    

    public object ConvertBack(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    
        throw new NotSupportedException();
    

    #endregion

【讨论】:

谢谢。转换器类有什么问题吗?或我必须使用的任何附加代码?我收到 targetType not boolean 错误! 如果答案的 xaml 在用户控件中并且在 mainWindowViewModel 中进行转换怎么办?一个人怎么能看到另一个人?我尝试了祖先类型,但它不起作用

以上是关于运行时错误:未找到 InverseBooleanConverter的主要内容,如果未能解决你的问题,请参考以下文章

运行时错误“1004”未找到单元格错误

prisma - 运行 graphql 查询时获取环境变量未找到错误消息

Android:未找到类运行时异常 - 仅发布版本

在 Android Studio 中运行参数化单元测试时,未找到给定的测试包括错误

在 H2 上运行查询时未找到列“name_c”错误

未找到模块:错误:运行故事书时无法解析“@emotion/styled/base”