当 WPF 中的绑定为空时,如何避免 xaml 警告?

Posted

技术标签:

【中文标题】当 WPF 中的绑定为空时,如何避免 xaml 警告?【英文标题】:How can I avoid xaml warnings when a binding is null in WPF? 【发布时间】:2015-05-30 23:32:00 【问题描述】:

在我的 WPF 应用程序中,当绑定对象不为空时,我有一个用图像画笔填充矩形的样式。该样式按我预期的方式工作,但是当 Binding 为空时,我会收到有关 ImageBrush 设置器值的警告。我希望我可以使用转换器或空触发器来避免这种情况,但我仍然收到警告。有没有一种方法可以绑定到一个对象并在 xaml 中检查它是否为 null 而不会在输出窗口中收到警告?

        <Style TargetType="Rectangle" x:Key="LightHeadRectangle">
            <Setter  Property="Fill" Value="Red" />
            <Style.Triggers>
                <DataTrigger Binding="Binding BarLight, Converter=StaticResource isNullConverter" Value="false">
                    <Setter  Property="Fill">
                        <Setter.Value>
                            <ImageBrush Stretch="Fill" ImageSource="Binding BarLight.OpenMount.ImagePath" />
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>​

更新:希望阻止发生一般的空警告,但我在这种情况下得到的具体警告是。

System.Windows.Data 错误:2:找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。 BindingExpression:Path=BarLight.OpenMount.ImagePath;数据项=空;目标元素是“ImageBrush”(HashCode=47952502);目标属性是“ImageSource”(输入“ImageSource”)

更新:

请注意,我使用这种样式来定位多个 listboxitem 数据模板可能会有所帮助。还有 BarLight,最初为 null。

【问题讨论】:

你得到什么警告? 你不是也绑定到 BarLight.OpenMount,BarLight 可以为 null,因此尝试从 null 获取 .OpenMount 是个问题吗? 在你的绑定库中抛出一个TargetNullValueFallbackValue 来处理它。 @TheodosiusVonRichthofen 是的,但即使逻辑返回 true,它仍然会通过 ImageBrush setter 的警告,在这种情况下不会被命中。 @ChrisW。不,这两种方法都不会停止警告消息。 【参考方案1】:

AFAIK 你不能在代码中关闭它们,但如果你使用 Visual Studio,你可以在那里关闭它们。

    转到工具 -> 选项 在调试下(在左侧窗格中),转到输出窗口 在 WPF 跟踪设置下(在右侧窗格中),找到数据绑定并将其值设置为关闭

话虽如此,绑定在 XAML 中静默失败是完全可以接受的。失败的绑定不会引发异常,因此它不会对最终用户产生影响(只要您,开发者,意味着绑定在某些情况下用户的体验不受影响)失败) .

警告只是作为开发人员的一种调试机制,以防他们不希望绑定失败。我不建议关闭此功能。

【讨论】:

也就是说,如果 WPF 提供一种机制来说明“我预计此特定绑定有时可能会失败并且我不想被警告”,那就太好了。我宁愿在“输出”窗格中显示 any BindingExpression 警告作为要调查和补救的内容,而不是接受这将是一个非空列表,我必须梳理以确定哪个是个问题,哪个不是。 永远不要建议任何人在 IDE 中打开 WPF 调试警告,这是为了他(或她)自己的利益。 @yatskovsky 我认为您的意思是在 IDE 中“关闭关闭”警告 当然,“关闭”。谢谢。 @yatskovsky 您显然没有阅读完整的答案,因为我的答案的最后一行说“我不建议将其关闭。”【参考方案2】:

将您的 ImageBrush 放在单独的资源中可以解决问题。

    <ImageBrush x:Key="brush" Stretch="Fill" ImageSource="Binding BarLight.OpenMount.ImagePath" />
    <Style TargetType="Rectangle" x:Key="LightHeadRectangle">
        <Setter Property="Fill" Value="Red" />
        <Style.Triggers>
            <DataTrigger Binding="Binding BarLight, Converter=StaticResource isNullConverter" Value="False">
                <Setter Property="Fill" Value="StaticResource brush">
                </Setter>
            </DataTrigger>
        </Style.Triggers>
    </Style>

【讨论】:

这只是将空错误从应用样式的模板移动到支持整个视图的数据上下文。

以上是关于当 WPF 中的绑定为空时,如何避免 xaml 警告?的主要内容,如果未能解决你的问题,请参考以下文章

WPF - ListView 为空时不显示上下文菜单

我有一种形式可以更新mysql中的某些值,当输入为空时,如何避免更新单元格?

有没有办法在 xaml 中隐藏 ListView?

数据绑定如何避免 WPF 中的递归更新?

如何在对话框中将事件侦听器绑定到JavaFX TextFields。当字段为空时,“确定”按钮将被禁用,反之亦然

WPF绑定复选框bool?