使用 DataTrigger 的 .NET Maui 样式

2023-12-27

概述:我有两个属性:

  1. IsPast
  2. IsCurrentMonth

如果已经过去或者not当月我想用红色显示标签。

以下代码是默认 Maui 应用程序的缩小版本。如果你运行它,你会得到红色标签(预期)。单击一次后,它会保持红色(预期),但单击后会打开和关闭红色。这是一个错误还是我不明白 DataTrigger/Style/whatever 的工作方式:

查看型号:

public class ViewModel : INotifyPropertyChanged
    {
        private bool _isPast;
        public bool IsPast
        {
            get => _isPast;
            set
            {
                _isPast = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsPast)));
            }
        }

        private bool _isCurrentMonth;
        public bool IsCurrentMonth
        {
            get => _isCurrentMonth;
            set
            {
                _isCurrentMonth = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsCurrentMonth)));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }

然后是 XAML:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:BugMaui"
             x:Class="BugMaui.MainPage"
             x:DataType="local:ViewModel">

    <VerticalStackLayout>

        <HorizontalStackLayout>
            <Label Text="IsPast: " />
            <Label Text="{Binding IsPast}" />
        </HorizontalStackLayout>

        <HorizontalStackLayout>
            <Label Text="IsCurrentMonth: " />
            <Label Text="{Binding IsCurrentMonth}" />
        </HorizontalStackLayout>

        <Label
            Text="Hello, World!"
            FontSize="32"
            HorizontalOptions="Center">
            <Label.Style>
                <Style TargetType="Label">
                    <Style.Triggers>
                        <DataTrigger TargetType="Label" Binding="{Binding IsPast}" Value="True">
                            <Setter Property="Background" Value="Red" />
                        </DataTrigger>
                        <DataTrigger TargetType="Label" Binding="{Binding IsCurrentMonth}" Value="False">
                            <Setter Property="Background" Value="Red" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Label.Style>
        </Label>

        <Button
            Text="Click me"
            Clicked="OnCounterClicked"/>

    </VerticalStackLayout>

</ContentPage>

以及背后的代码:

public partial class MainPage : ContentPage
{
    ViewModel viewModel;

    public MainPage()
    {
        InitializeComponent();
        viewModel = new ViewModel { IsCurrentMonth = true, IsPast = true };
        BindingContext = viewModel;
    }

    private void OnCounterClicked(object sender, EventArgs e)
    {
        viewModel.IsPast = !viewModel.IsPast;
        viewModel.IsCurrentMonth = !viewModel.IsCurrentMonth;
    }
}

我对这个问题的回答是是的,这是一个错误如果 .NET MAUI 开发人员没有决定更改 DataTrigger/Style 在 XAMARIN(以及 WPF)中的工作方式。

根据.NET MAUI 触发器文档 https://learn.microsoft.com/en-us/dotnet/maui/fundamentals/triggers?view=net-maui-7.0#data-triggers, 数据触发应该“当绑定数据满足指定条件时,应用属性值或执行操作”。如果不满足条件,则不应执行任何操作。

因此,如果 viewModel.IsCurrentMonth 为 False 或 viewModel.IsPast 为 True,您代码部分中的 DataTrigger 是正确的,可以满足您设置红色背景的要求:

<DataTrigger TargetType="Label" Binding="{Binding IsCurrentMonth}" Value="False">
    <Setter Property="Background" Value="Red" />
</DataTrigger>
<DataTrigger TargetType="Label" Binding="{Binding IsPast}" Value="True">
    <Setter Property="Background" Value="Red" />
</DataTrigger>

这个用例DataTrigger 在 XAMARIN 和 WPF 中都运行良好。正如预期的那样,通过重复点击,背景仍保持红色。

没有解释为什么在 .NET MAUI DataTrigger 中工作方式不同。红色背景仅根据绑定到 DataTrigger 的“lastly set”属性的值进行设置。因此,如果不满足条件,则先前满足的条件将被忘记,并设置默认(透明)背景。

在您的示例中,这意味着背景是根据 viewModel.IsCurrentMonth 属性设置的:

private void OnCounterClicked(object sender, EventArgs e)
{
    viewModel.IsPast = !viewModel.IsPast;
    viewModel.IsCurrentMonth = !viewModel.IsCurrentMonth;
}

如果更改 OnCounterClicked 事件处理程序中设置 viewModel 属性的顺序,则背景将根据 viewModel.IsPast 属性的值设置。

private void OnCounterClicked(object sender, EventArgs e)
{ 
    viewModel.IsCurrentMonth = !viewModel.IsCurrentMonth;
    viewModel.IsPast = !viewModel.IsPast;        
} 

多触发提出于这个答案 https://stackoverflow.com/a/73755816/14606023不能满足您的要求,正如张丽云评论中提到的那样。

Liyung 张提出的针对此错误的以下解决方法正在发挥作用,但如果所描述的 DataTrigger 行为是否是错误,它仍然无法回答原始问题:

<Label.Style>
    <Style TargetType="Label">
        <Setter Property="Background" Value="Red" />
        <Style.Triggers>
            <MultiTrigger TargetType="Label">
                <MultiTrigger.Conditions>
                    <BindingCondition Binding="{Binding IsPast}" Value="False" />
                    <BindingCondition Binding="{Binding IsCurrentMonth}" Value="True" />
                </MultiTrigger.Conditions>
                <Setter Property="Background" Value="Transparent" />
            </MultiTrigger>
        </Style.Triggers>
    </Style>
</Label.Style>

结论:根据我的经验,上述新的 .NET MAUI DataTrigger 行为可以归类为错误,不幸的是,它是开发中其他问题的根源,不仅在 DataTrigger 样式中,而且在 MultiTrigger 使用中,我不得不与类似的不可预测的意外情况作斗争,并且真的很奇怪的行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 DataTrigger 的 .NET Maui 样式 的相关文章

随机推荐

  • 如何从错误:监听 EADDRINUSE 中释放 localhost

    我正在Windows 7上测试用nodejs编写的服务器 当我尝试在命令行中运行测试器时 出现以下错误 Error listen EADDRINUSE at errnoException net js 614 11 at Array 0 n
  • 反序列化 JSON 并访问元素

    我有以下代码 dynamic stuff JsonConvert DeserializeObject Name Jon Smith Address A B C Age 42 var name stuff Name MessageBox Sh
  • “ResourceCycle”类型问题的说明:生成签名的 Apk 时

    更新到 appcompat v7 24 0 0 alpha1 后生成签名的 apk 时出现错误 Error Error Style Resource definition cycle TextAppearance AppCompat Lig
  • 卷积神经网络 - 如何获取特征图?

    I read a few books and articles about Convolutional neural network it seems I understand the concept but I don t know ho
  • href 内有小胡子

    我有这样的 JSON something http something com 和 HTML 像这样 a href something something a 当我应用 Mustache 时 我得到 a href 7B 7Bsomethin
  • 如何从批处理文件中仅删除空目录

    有没有办法从批处理文件中删除给定目录下的所有空子目录 或者是否可以递归复制目录 但排除任何空目录 你确实有两个问题 1 有没有办法从批处理文件中删除给定目录下的所有空子目录 是的 这个一行 DOS 批处理文件对我有用 您可以传入模式 roo
  • 多线 lambda 比较器

    我从 Java 中的 lambda 表达式开始 有一些我认为很奇怪的东西 我确信我做错了什么或者它有解决方法 要定义比较器 我可以这样做 col setComparator CustomCell o1 CustomCell o2 gt Co
  • 我们最终可以在企业软件中转向 DVCS 吗? SVN 仍然是开发的“必备”吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 零大小 malloc [重复]

    这个问题在这里已经有答案了 非常简单的问题 我编写了以下程序 include
  • 实时查询/聚合数百万条记录 - hadoop?数据库?卡桑德拉?

    我有一个可以并行化的解决方案 但我 还 没有 hadoop nosql 的经验 并且我不确定哪种解决方案最适合我的需求 理论上 如果我有无限的 CPU 我的结果应该立即返回 因此 任何帮助将不胜感激 谢谢 这是我所拥有的 数千个数据集 da
  • 如何处理不停止线程的行为不良的库

    处理在库关闭时无法正确清理线程的第三方库时 有哪些解决方法 许多库显式或隐式地公开其中包含的代码的生命周期方法 例如 Web 应用程序框架存在于 Servlet 容器中的 Web 应用程序上下文中 创建上下文时 框架可能会出于各种原因启动一
  • 使用正则表达式检查字符串是否以辅音开头

    有没有更好的方法在 Ruby 中编写以下正则表达式 第一个正则表达式匹配以 小写 辅音开头的字符串 第二个正则表达式以元音开头 我试图弄清楚是否有一种方法可以编写与第二个表达式的负数匹配的正则表达式 而不是编写具有多个范围的第一个表达式 s
  • 有没有办法检测我是否将鼠标悬停在文本上?

    我真正想要的是检测光标何时更改为 文本 类型 即何时将鼠标悬停在一段文本上 我尝试查看我悬停的元素类型 但这不太准确 因为我不知道它们实际包含什么 据我所知 只有我之前指定了 CSS 光标属性 才可以检测到该属性 这有可能吗 你会怎样做呢
  • 简单的 Java 2d 数组迷宫示例

    我正在工作或了解如何创建一个简单的java 二维迷宫应该是这样的 int maze 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 0 0 0 0 1 1 0 1 0 0 0 1 0 1 1 1 0 1
  • 更改php版本后php网站无法运行

    我在 Ubuntu 13 04 环境中使用 php 我已经配置了 apache 以便在我的主目录中有一个public html我保存我正在处理的所有网站的目录 我可以通过以下方式访问它们localhost homedir website 以
  • 如何使CSS边框图像工作

    我的网站上有边框 我想在垂直菜单的顶部放置一个图像 在底部放置一个图像 在中间放置一个背景 但这不起作用 这是我的代码 border image border solid transparent 10px I tried with and
  • 如何在PowerShell中将环境变量打印到控制台?

    我开始使用 PowerShell 并试图弄清楚如何echo将系统环境变量发送到控制台来读取它 以下两者均不起作用 第一个只是打印 PATH 第二个不打印任何内容 echo PATH echo PATH 变量名前缀为env env path
  • 在 MacOS 上将 Vapor 编译为独立应用程序

    我想用我的代码将 Vapor 编译为 MacOS 应用程序 以便我可以将其放置在内部服务器上 拖动并单击以启动它 我不想在服务器上安装 Xcode swift 和其他开发文件 我是 Vapor 和 Swift 的新手 当我从 xCode 构
  • 多列上的 DISTINCT

    I have SELECT DISTINCT first second third FROM table 我不仅希望第一个是 DISTINCT 第二个是 DISTINCT 而且还希望第三个保持不 DISTINCT 我这样尝试过 SELECT
  • 使用 DataTrigger 的 .NET Maui 样式

    概述 我有两个属性 IsPast IsCurrentMonth 如果已经过去或者not当月我想用红色显示标签 以下代码是默认 Maui 应用程序的缩小版本 如果你运行它 你会得到红色标签 预期 单击一次后 它会保持红色 预期 但单击后会打开