XAML 页面中的 Bindable 值存在问题

2024-07-04

我有一个保龄球回顾示例代码,其中输入了 3 场比赛并总结在系列列中。我遇到的问题是系列列没有按照我的预期进行更新。显然,我做错了什么,但看不到我做错了什么。以下是支持该应用程序的代码:

<?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"
             x:Class="HoriView.MainPage">
    
    <StackLayout>
        <ScrollView>
            <VerticalStackLayout
                Spacing="25"
                Padding="30,0"
                VerticalOptions="Center">

                <Image
                    Source="dotnet_bot.png"
                    HeightRequest="200"
                    HorizontalOptions="Center" />
    
                <Label
                    Text="Hello, Bowlers!"
                    FontSize="32"
                    HorizontalOptions="Center" />
    
                <Label
                    Text="Bowling Recap Snippet"
                    FontSize="18"
                    HorizontalOptions="Center" />
    
            </VerticalStackLayout>
    
        </ScrollView>
        <ScrollView>
            <HorizontalStackLayout HorizontalOptions="Center">
                <CollectionView SelectionMode="Single" ItemsSource="{Binding scores}" ItemsLayout="HorizontalList">
                    <CollectionView.ItemTemplate>
                        <DataTemplate>
                            <Grid Padding="10">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="Auto"/>
                                </Grid.RowDefinitions>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto"/>
                                </Grid.ColumnDefinitions>
                                <Label Text="{Binding Game}" FontSize="Medium" WidthRequest="83" VerticalOptions="Center" HorizontalOptions="EndAndExpand" HorizontalTextAlignment="End"></Label>
                               <Entry Grid.Row="1" Text="{Binding Score}" TextChanged="UpdateGame" Keyboard="Numeric" ReturnType="Next" Placeholder="Game" WidthRequest="83" FontSize="Medium" ></Entry>
                            </Grid>
                        </DataTemplate>
                    </CollectionView.ItemTemplate>
                </CollectionView>
            </HorizontalStackLayout>
        </ScrollView>
    </StackLayout>
    
</ContentPage>
using System.Collections.ObjectModel;
    
namespace HoriView;
    
public partial class MainPage : ContentPage
{
    public ObservableCollection<Games> scores { get; set; }
    string header = "Game";
    
    public MainPage()
    {
        InitializeComponent();
        scores= new ObservableCollection<Games>();
        for(int i=0; i<4; i++)
        {
            if (i == 3)
            {
                header = "Series";
            }
            else
            {
                header = "Game" + (i+1).ToString();
            }
            scores.Add(new Games() 
            { 
                Game=header, 
                Score=0
            });
                
        }
        BindingContext = this;
    }
    
    public void UpdateGame(object sender, TextChangedEventArgs e)
    {
        scores[scores.Count-1].Score = 0;
        for(int i=0; i< scores.Count-1; i++) 
        {
            scores[scores.Count - 1].Score += scores[i].Score;
        }
    }
}
public class Games
{
    public string Game { get; set; }
    public int Score { get; set; }
}

任何帮助,将不胜感激。谢谢。


Your Games类没有实现INotifyPropertyChanged界面。

您可以手动实现:

public class Games : INotifyPropertyChanged
{
    private string _game;
    public string Game
    {
        get => _game;
        set
        {
            if(_game == value) return;
            _game = value;
            OnPropertyChanged();
        }
    }

    private int _score;
    public int Score
    {
        get => _score;
        set
        {
            if(_score == value) return;
            _score = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged([CallerMemberName] string propertyName = "")  
    {  
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }  
}

或者,您也可以继承自ObservableObject来自MVVM 社区工具包 https://learn.microsoft.com/dotnet/communitytoolkit/mvvm/然后使用源生成器简单地编写以下内容:

public partial class Games : ObservableObject
{
    [ObservableProperty]
    private string _game;

    [ObservableProperty]
    private int _score;
}

在这种情况下,您只需定义支持字段,源生成器将创建大写的可观察属性Game and Score为你。

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

XAML 页面中的 Bindable 值存在问题 的相关文章

  • 如何实现一个单链表队列,使其入队和出队时间复杂度为O(1)?

    这是一个练习 来自CLRS 3rd 10 2 3 通过单向链表 L 实现队列 ENQUEUE 和 DEQUEUE 操作仍然需要 O 1 时间 使用单链表实现队列并不难 我的问题是关于时间复杂度的 如何实现耗时 O 1 的 ENQUEUE 和
  • 对 .NET Remoting CAO 的暴力攻击

    我正在尝试使用 NET 远程客户端激活对象来在多次调用期间保留客户端的身份验证信息 而不是实现需要客户端在每次调用中发送会话 ID 的会话管理系统 正如 MSDN 所说 当客户端使用 new 运算符提交对服务器对象的请求时 激活请求消息将发
  • 如何检测动态绘制图形的点击?

    我正在面板上绘制文件和文件夹名称列表 并试图集体讨论检测用户是否单击文件 文件夹名称以及何时单击文件 文件夹名称以及他们实际单击的文件或文件夹名称的最佳方法 以下是我迄今为止编写的方法 我的第一个想法是用透明控件搭载每段文本 并以这种方式动
  • XAML 页面中的 Bindable 值存在问题

    我有一个保龄球回顾示例代码 其中输入了 3 场比赛并总结在系列列中 我遇到的问题是系列列没有按照我的预期进行更新 显然 我做错了什么 但看不到我做错了什么 以下是支持该应用程序的代码
  • node.js 本机插件 - 包装类的析构函数不运行

    我正在用 C 编写一个 Node js 插件 我使用 node ObjectWrap 包装一些类实例 以将本机实例与 JavaScript 对象关联起来 我的问题是 包装实例的析构函数永远不会运行 这是一个例子 point cc inclu
  • 如何有效计算灰度图像中像素的平均“方向”?

    所以我发现我可以将图像转换为灰度图像 如下所示 public static Bitmap GrayScale this Image img var bmp new Bitmap img Width img Height using var
  • 测试用户输入数组中的重复项的最有效方法是什么?

    我正在尝试编写一个模拟器来玩强力球彩票 程序会要求5数字 又名白球 并输入到6元素数组和另一个数字 红色强力球 放入6th 元素 我需要弄清楚如何首先测试重复项5元素但6th 不需要是唯一的 我有一个循环 我认为可以工作 但它甚至不执行并且
  • 如何连接 COM 事件调度程序?

    VBIDE API 揭示了令人惊奇的神秘之处 dispVBComponentsEvents接口 除其他外 其中看起来像我可以用它来捕获 VBE 中各种有趣的事件 因此 我在一个类中实现了该接口 该类旨在捕获事件并引发 正常 net 事件以供
  • 迁移到新 csproj 格式的 WPF 应用程序上未定义 RunCommand 属性

    我正在尝试将旧 csproj 格式构建的 WPF 应用程序迁移到为 VS2017 定义的新 csproj 格式 我已经能够编译该应用程序 但是当我尝试在 VS2017 下的调试器中启动它时 我收到以下错误消息 无法运行您的项目 未定义 Ru
  • 多次声明全局变量时,GCC 没有警告或错误[重复]

    这个问题在这里已经有答案了 假设有以下代码 File a c include
  • SWIG Python 结构体数组

    我已经搜索了几天 试图弄清楚如何将结构数组转换为 Python 列表 我有一个函数返回指向数组开头的指针 struct foo int member struct foo bar struct foo t malloc sizeof str
  • 您会在哪里使用友元函数与静态成员函数?

    当我们希望非成员函数访问该类的私有成员时 我们将其设为该类的友元函数 这赋予它与静态成员函数相同的访问权限 两种选择都会为您提供一个不与该类的任何实例关联的函数 什么时候我们必须使用友元函数 什么时候必须使用静态函数 如果两者都是解决问题的
  • OpenCV 图像处理——C++、C、Python

    我正在考虑在一个项目中尝试 OpenCV 并注意到它有 C C 和 Python 我正在尝试确定是否应该使用 C C 还是 Python 并且希望使用具有最佳 OpenCV 支持的任何语言 仅从查看各种文档的索引页来看 C 绑定可能比其他绑
  • 无堆栈协程与堆栈协程有何不同?

    背景 我问这个问题是因为我目前有一个具有许多 数百到数千 线程的应用程序 这些线程中的大多数在很大一部分时间内处于空闲状态 等待将工作项放入队列中 当工作项可用时 它会通过调用一些任意复杂的现有代码来处理 在某些操作系统配置上 应用程序会遇
  • 如何解决有关 TcpListener: 请使用 TcpListener(IPAddress localaddr, int port) 的警告?

    我创建了一个新表单 在顶部我做了 using System using System Collections Generic using System ComponentModel using System Data using Syste
  • 鱼眼图像不失真的正确方法

    我已经完成了一些示例程序 可以消除棋盘上的镜头失真 如鱼眼图像 并且工作正常 这是屏幕截图 接下来 我想使用鱼眼棋盘图案 上右图 来消除相同的镜头畸变 但从真实图像中去除 但没有运气 曲率仍然保留在未畸变的图像上 因此我得到了这个 the
  • 如何通过参数包传递引用?

    我有以下代码 include
  • 将字符串中的每个字符转换为 ASCII

    谁能告诉我如何轻松地将字符串中的每个字符转换为 ASCII 值 以便我可以对这些值求和 我需要对哈希函数的值求和 字符串中的每个字符都已经是 ascii include
  • GO 语句破坏了 .NET 中的 SQL 执行

    我有一个非常简单的 C 命令 shell 应用程序 它执行 SQL Server 生成的 SQL 脚本来编写模式和数据脚本 它在 GO 声明中爆炸了 错误信息 GO 附近的语法不正确 这是完整的 sql 脚本 Object Table gy
  • .NET 中是否有任何集合可以防止空条目?

    我特别考虑的是履行一套合同的集合 但我认为这个问题可以适用于任何类型 NET 框架中是否存在可以防止空条目的集合 我想要的具体行为是这样的 var set new HashSet bool added set Add null Consol

随机推荐