xamarin 表单 - 与选择器的两种方式绑定 - 为什么我不能从后面的代码更新选择器?

2023-11-29

我的产品页面仅显示“产品名称”和“数量”,数量显示/绑定到选择器。

为了进行测试以使其正常工作,仅从虚拟机加载 2 个产品。酒1和酒2。

当应用程序加载时,为什么选择器是空的,没有选择任何值。当每个项目的数量设置为 1 时,从 VM 加载时

数量设置为 1,选择器在最初加载时并未更新,我知道这一点是因为如果我单击空选择器并选择 1。没有任何反应,因为代码命中

if (quantity != value)

// 其中选择的数量 1 在后面的代码中已经是 1,因此不会从数量的 setter 中调用 propertyChanged,

还... 如果我选择选择器并选择另一个数字,例如 4。命中数量的 setter 并命中 OnPropertyChanged,并在选取器上显示 4。 (如果选择了 3,我什至测试了更改产品名称) 这奏效了。

我知道这一切都有效,因为我已经逐步完成了代码。然而,现在发生的另一个问题是,由于某种原因,每次单击后,代码都会再次点击数量获取/设置并将值设置为 0。

因此,例如,如果单击 4,选择器将在屏幕上更新为 4,然后如果我按照它逐步执行代码,则会再次调用数量设置器,将值设置为 0,从而在选择器中不选择任何内容。将其保留为空白,就像最初加载时一样。

任何帮助解决这个问题的帮助将不胜感激,谢谢

感谢 Y 提供的任何帮助

public class ProductModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        private int quantity;
        private string productName;

        public ProductModel()
        { }

        [PrimaryKey, AutoIncrement]
        public int ProductId { get; set; }

        [MaxLength(50)]
        public string ProductName
        {
            get
            {
                return productName;
            }
            set
            {
                productName = value;
                OnPropertyChanged();
            }
        }

        public int Quantity
        {
            get
            {
                return quantity;
            }
            set
            {
                if (quantity != value)
                {
                    quantity = value;
                    OnPropertyChanged();

                    //test to check if binding works, successfully changed ProductName to "test" if 3 is picked from picker
                    if (quantity == 3)
                        ProductName = "test;";
                }

            }
        }
        protected void OnPropertyChanged([CallerMemberName] string name = null)
        {
            var changed = PropertyChanged;
            if (changed == null)
                return;

            changed.Invoke(this, new PropertyChangedEventArgs(name));
        }

    }
    public class ProductPageViewModel : BindableObject
        {
           public ObservableCollection<ProductModel> WineList { get; set; }
            public ProductPageViewModel ()
            {
                WineList = new ObservableCollection<ProductModel>();
                WineList.Add(new ProductModel { ProductId = 1, ProductName = "Wine 1", Quantity = 1});
                WineList.Add(new ProductModel { ProductId = 2, ProductName = "Wine 2", Quantity = 1});
            }
   
        
    
    
 <?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="ScrollApp2.Views.ProductPage">
    <ContentPage.Content>
        <StackLayout>
         
            <ListView  x:Name="producttablelist" IsVisible="True" VerticalOptions="FillAndExpand" HasUnevenRows="True" ItemsSource="{Binding WineList}" HeightRequest="1500">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <StackLayout HeightRequest="120" BackgroundColor="Green" HorizontalOptions="StartAndExpand">
                                <Grid>
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="Auto"/>
                                        <RowDefinition Height="Auto"/>
                                    </Grid.RowDefinitions>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>
                                <Label Grid.Row="0" Grid.Column="0" Text="{Binding ProductName}" TextColor="Black" VerticalOptions="Start"></Label>

                                    <Picker Grid.Column="1" Grid.Row="0" SelectedItem="{Binding Quantity,Mode=TwoWay}">
                                        <Picker.Items>
                                            <x:String>0</x:String>
                                            <x:String>1</x:String>
                                            <x:String>2</x:String>
                                            <x:String>3</x:String>
                                            <x:String>4</x:String>
                                            <x:String>5</x:String>
                                            <x:String>6</x:String>
                                        </Picker.Items>
                                    </Picker>
                                </Grid>
                            </StackLayout>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

            
        </StackLayout>
       
    </ContentPage.Content>
</ContentPage>

    
   namespace ScrollApp2.Views
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class ProductPage : ContentPage
    {
        public ProductPage()
        {
            InitializeComponent();
            BindingContext = new ProductPageViewModel();
        }
    }
}

你的ProductModel类不继承自INotifyPropertyChanged接口,您需要将接口添加到您的类中并实现它,同时确保引发INotifyPropertyChanged.PropertyChanged事件在Quantity二传手。

您可能想要创建一个ProductViewModel此时,我不确定您是否要添加INotifyPropertyChanged到 POCO 类,例如ProductModel.

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

xamarin 表单 - 与选择器的两种方式绑定 - 为什么我不能从后面的代码更新选择器? 的相关文章

随机推荐

  • 如何将 iScroll4 与 SwipeView 结合使用?

    我正在使用 iScroll4 在移动网站内的图像上创建水平滚动效果 iScroll 工作得非常好 但问题是 iScroll 包装器中包含的图像禁用了本机垂直滚动 换句话说 用户通过手指滑动来导航页面的操作在 iScroll 包裹图像内的任何
  • 在php中获取图像src

    如何使用 php 函数从 img 标签获取图像源 或者 您可以使用内置 DOM 函数 如果您使用 PHP 5 doc new DOMDocument doc gt loadHTMLFile url xpath new DOMXpath do
  • 录制成WAV文件

    自从我发帖以来这个问题 我一直在尝试自己从原始 PCM 数据编写一个有效的 WAV 文件 我已经成功编写了 FLAC 转换器 经过测试并且可以工作 但它不会对我一直在编写的 WAV 文件进行编码 我不确定我做错了什么 我一直在网上搜索其他个
  • 确定 .NET Core 中的操作系统

    如何确定我的 NET Core 应用程序正在哪个操作系统上运行 过去我可以使用Environment OSVersion 当前确定我的应用程序是在 Mac 还是 Windows 上运行的方法是什么 Method System Runtime
  • List 作为使用 Spring 3 MVC 的表单支持对象,语法正确吗?

    我想做这样的事情 在哪里Foo是一个具有一个 String 字段名称和 getter setter 的类
  • 音频队列启动失败

    我正在开发一个项目 它既有音频流又有文件播放音频 对于音频流 我使用 AudioStreamer 对于从文件播放 我使用 avaudioplayer 只要应用程序不被电话或短信打断 流媒体和播放都可以完美运行 但是 当我尝试重新启动流媒体时
  • 如何删除 XCode 4.2 并安装 4.1 以在 OSX Lion 上开发 Ruby / Rails?

    我使用 RVM ruby 版本管理器 开发 Rails 应用程序 我必须下载 XCode 在应用商店中我只得到了 4 2 版本 现在 RVM 说它无法使用此 XCode 正确构建 rubies 所以我遵循了本教程 http www fred
  • Reactjs - 当谷歌仅显示空白页面时获取

    I ve just coded my first website using reactjs but when I check how google sees my website I receive the following resul
  • PHP 将两个独立的冲突日期范围组合成唯一的对

    设置一 2014 04 05 至 2014 06 27 2014 06 28 至 2014 10 19 Set two 2014 04 05 至 2014 05 02 2014 05 03 至 2014 05 31 2014 06 01 至
  • VBA Access 获取 RowSource 来查找查找值

    VBA菜鸟在这里 截至此哀悼 在 MS Access 中 我编写了一个测试函数 根据您传入的某些条件查找记录的值 该函数似乎工作正常 除非我正在搜索的列中有查找 基本上它可能返回 19 并且 19 对应于其他一些表值 看来该列的 RowSo
  • C# 将一个图片框拖放到另一个图片框

    我正在尝试将一个图片框拖放到另一个图片框中 请帮我 谢谢 此致 看到这个http www codeguru com Csharp Csharp cs syntax controls article php c5865 更新 做一招 bool
  • 调试 ADO log4net 附加程序(不会附加)

    我以前曾这样做过 但现在不起作用 在过去的两个小时里我一直在抓狂地试图弄清楚它 我有几个附加程序 其中一些用于 主 日志 另一个用于另一个 任务 日志 主日志有 4 个附加程序 控制台 内存 文件和 DB sqlite3 任务日志有 3 个
  • CallKit 有两个来电

    我使用 CallKit 开发 VoIP 应用程序 如果用户收到两个来电并且他 她接听其中一个来电 则另一个将被关闭 例如报告两个来电 reportInComingCall uuid 70D506FB 6A9D 4111 8828 35DB8
  • 获取列表类型的元素类型[重复]

    这个问题在这里已经有答案了 我有一些列表类型 来自inspect signature gt inspect Parameter 并且我想了解它们元素的类型 我当前的解决方案有效 但非常丑陋 请参阅下面的最小示例 from typing im
  • 有没有办法访问replicate()中的迭代次数?

    有没有办法访问当前的复制数replicate函数 这样我就可以将它用作重复评估中的变量 例如 在这个简单的示例中 我想使用当前复制数来生成当前复制数的可变长度向量列表 例如 x下面代表当前的复制 replicate 3 rep x samp
  • 如何获取程序运行的目录?

    是否有一种与平台无关和文件系统无关的方法来获取使用 C C 运行程序的目录的完整路径 不要与当前工作目录混淆 请不要推荐库 除非它们是标准库 例如 clib 或 STL 如果没有与平台 文件系统无关的方法 也欢迎在 Windows 和 Li
  • R.layout.menu无法解析

    早些时候一切都工作正常 然后我碰巧向我的布局添加了一个新的 xml 文件 现在 当 setContentView 指向 R layout menu 时 我的一个类出现错误 Eclipse 告诉我 R layout menu 无法解析 我不明
  • C++ 宏有条件编译代码?

    我想根据宏有条件地编译代码 基本上我有一个看起来像这样的宏 从真实版本简化 if DEBUG define START BLOCK x if DebugVar x char debugBuf 8192 define END BLOCK pr
  • 如何使 php cos 函数返回正确的值?

    我试过了 x cos deg2rad angle 但当角度为 90 度而不是 0 时 它会返回 6 12323399574E 17 我读到这是一个浮点问题 但是有解决方法吗 6 1E 17是almost无论如何都是零 如果您需要实际将结果与
  • xamarin 表单 - 与选择器的两种方式绑定 - 为什么我不能从后面的代码更新选择器?

    我的产品页面仅显示 产品名称 和 数量 数量显示 绑定到选择器 为了进行测试以使其正常工作 仅从虚拟机加载 2 个产品 酒1和酒2 当应用程序加载时 为什么选择器是空的 没有选择任何值 当每个项目的数量设置为 1 时 从 VM 加载时 数量