【问题标题】:Hide xaml element when null为 null 时隐藏 xaml 元素
【发布时间】:2017-07-24 10:55:36
【问题描述】:

我们有一个使用 Template10 的 UWP 应用。有一个显示折扣的文本块和文本框。当ViewModel.Discount 为空时,我们希望隐藏文本块。

在 App.xaml 中我们定义了一个转换器

<T10Converters:ValueWhenConverter x:Key="HideWhenNullConverter" When="{x:Null}">
    <T10Converters:ValueWhenConverter.Value>
        <Visibility>Collapsed</Visibility>
    </T10Converters:ValueWhenConverter.Value>
    <T10Converters:ValueWhenConverter.Otherwise>
        <Visibility>Visible</Visibility>
    </T10Converters:ValueWhenConverter.Otherwise>
</T10Converters:ValueWhenConverter>

在 View 中我们设置 TextBlock 的可见性

Visibility="{x:Bind ViewModel.Discount, Converter={StaticResource HideWhenNullConverter}}"

在 ViewModel 中:

public class ViewModel : ViewModelBase
{
    decimal? _Discount = default(decimal?);
    public decimal? Discount
    {
        get
        {
            return _Discount;
        }
        set
        {
            if (value == 0) value = null;
            Set(ref _Discount, value);
        }
    }

然而,即使ViewModel.Discount 的值为空,文本块也始终可见。 ViewModel.Discount 为空时如何隐藏文本块

【问题讨论】:

  • 您还可以声明可见性逻辑是 ViewModel 的责任。最新的 UWP 可以直接将 Visibility 绑定到布尔值。想象一下,您以后有额外的业务规则,例如最高价格左右。
  • @HenkHolterman 很好,感谢您提到这一点 - 我不知何故 missed this
  • 14393Visibility="{x:Bind ViewModel.Discount.HasValue, Mode=OneWay}".
  • 实际上,如果您使用 14393,您应该避免使用转换器,因为它们很慢。相反,您可以直接绑定一个函数。
  • 是的@Justin XL 这就是我们发现的......转换器非常慢。感谢您的提示!

标签: xaml uwp template10


【解决方案1】:

正如我尝试使用 Template10's source 一样,它应该可以工作。我怀疑您只是缺少使用x:Bind 重新定义Mode,默认情况下是OneTime。试试这样:

Visibility="{x:Bind ViewModel.Discount, Mode=OneWay, Converter={StaticResource HideWhenNullConverter}}"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 2012-12-08
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多