如何检测 xamarin UWP 应用程序中标签元素的文本值更改?

Posted

技术标签:

【中文标题】如何检测 xamarin UWP 应用程序中标签元素的文本值更改?【英文标题】:how to detect text value change for label element in xamarin UWP application? 【发布时间】:2021-12-11 01:36:16 【问题描述】:

我需要一种方法来检测特定标签元素何时设置了文本值。这在应用程序加载时以编程方式发生。我查询共享点,并获取文件列表。对于每个文件,我都会显示它是否已签出。

如果该文件已签出,然后我想在本地计算机中搜索一个自定义令牌文件,该文件确定是否是当前用户已签出该文件。如果我在本地计算机上找到特定文件的相应标记,我想将当前显示的文本/图标的颜色更改为红色。

问题

此时,文件的初始列表正确显示,并且...当 DriveItem.Publication.Level 为结帐时显示特定图标的逻辑工作正常。 但是在我尝试检测何时设置结帐图标的新事件处理程序中,我不知道如何: a) 仅检查特定标签的更改。 b) 获取关联文件的名称(另一个标签元素) c) 以编程方式更改图标的颜色。

到目前为止,我有以下代码:

XAML

根据我的研究,我了解到,由于标签没有 textchanged 事件,我必须为整个类添加事件处理程序。注意下面的“PropertyChanged="SPDocumentLibraryContentsChanged":

 <?xml version="1.0" encoding="utf-8" ?>
 <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
     xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:local="clr-namespace:GraphTutorial.Models"

     Title="Shared Document Library"
     x:Class="GraphTutorial.SPDocumentLibraryContentsPage"
         PropertyChanged="SPDocumentLibraryContentsChanged">

后来我有以下元素。这是我需要评估和更改颜色的结帐状态,如果它设置为“结帐”

 <Label Grid.Column="0" Text="Binding Path=DriveItem.Name" FontSize="Small" />
 <Label Grid.Column="1" x:Name="CheckoutStatus" Text="Binding Path=DriveItem.Publication.Level,Converter=StaticResource IconValueConverter" FontFamily="Segoe MDL2 Assets" FontSize="Small"/>

CS 代码

这就是我的问题所在。首先,我似乎无法捕获正确的属性名。我试过了

DriveItem.Publication.Level 等级

但似乎两者都不起作用。

    private void SPDocumentLibraryContentsChanged(object sender, PropertyChangedEventArgs e)
    
        if (e.PropertyName == "Level")
        
            Console.WriteLine(sender);
            Console.Write(e);
        

我试图遵循的示例是这样的: Handle event when Label Text Change

任何提示将不胜感激。

【问题讨论】:

为什么需要监控 UI 的变化?您的代码正在更新 UI,那么为什么不从源头监控更改呢? 当用户启动我的应用程序时,主要上游数据库中唯一可用的信息是 - 共享文件列表,以及文件是否已签出。它不存储文件签出给谁。所以现在,当用户使用我的应用程序签出文件时 - 我在本地创建一个隐藏文件。当他们签入时,我删除了隐藏文件。在应用程序启动时,我需要 a) 从上游获取列表。 b) 强制应用检查我的本地文件夹是否有隐藏文件,然后更新图标的颜色。 这仍然无法解释为什么您依赖 UI 来检测数据状态的变化。 @Jason 我想对于应用程序启动场景,我可以调用“checklocalfolder()”的排序方法,并在初始化列表后调用它......但我想避免不得不每次检查整个共享文件列表的内容。所以......对于应用程序启动,因为 GUI 已经循环并填写每个文件的状态 - 我虽然跟踪文本属性何时更改会更有效 听起来您缺少驱动 UI 的内部数据模型 【参考方案1】:

如何在 xamarin UWP 应用程序中检测标签元素的文本值变化?

标签包含PropertyChanged事件,你可以监听它来检查当前Text属性是否改变。

例如

MyLabel.PropertyChanged += MyLabel_PropertyChanged;
private void MyLabel_PropertyChanged(object sender, PropertyChangedEventArgs e)

    if (e.PropertyName == "Text")
    
        // process logic
    

如果你想监听视图模型的绑定属性,你需要为你的视图模型添加事件处理程序。更多请参考本案例reply

例如

public MyClass() => PropertyChanged += MyClass_PropertyChanged;
private void MyClass_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)

    if (e.PropertyName == nameof(LocationName) || e.PropertyName == nameof(SubLocationName))
    
        RaisePropertyChanged(nameof(LocationCompleteString));
    

【讨论】:

以上是关于如何检测 xamarin UWP 应用程序中标签元素的文本值更改?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 Xamarin UWP 应用名称

如何在 Xamarin.UWP 应用程序中实现 LongPress?

如何将“安装”目标添加到 Xamarin.UWP .csproj 文件?

如何在 Visual Studio 2019 中使用 Xamarin Forms(UWP) 和 C# 创建 Web 应用程序

如何将 UWP 目标添加到现有 Xamarin Forms 项目?

如何更改 Xamarin.Forms UWP 应用程序的强调色?