C#,Xamarin表单-自定义对象的ObservableCollection更新,但不触发属性更改事件

tyky79it  于 2023-01-06  发布在  C#
关注(0)|答案(1)|浏览(160)

我有一个用产品填充的集合。一旦填充了集合,绑定到StackLayout的BindableLayout/DataTemplate将显示项目,并提示用户选择通过键入条目来更改库存项目的描述。

用户可以在提供的输入框中键入以更改描述,更改将成功应用于Observable Collection,但不会触发属性更改事件。

我需要触发属性更改事件,以便可以有效地执行代码的其他部分,但是由于集合不会触发属性更改,因此它永远没有机会通知其他属性进行更新。

namespace Testing
{
    public class RecordStock : BaseContentPage, INotifyPropertyChanged
    {
        public class StockInfo : BaseContentPage, INotifyPropertyChanged
        {
            private string description;
            public string Description
            {
                get => description; set
                {
                    description = value; OnPropertyChanged();
                }
            }
        }

        private ObservableCollection<StockInfo> stockItems = new ObservableCollection<StockInfo>();
        public ObservableCollection<StockInfo> StockItems
        {
            get => stockItems;
            set
            {
                stockItems = value;
                OnPropertyChanged();
            }
        }

        DataTemplate StockTemplate = new DataTemplate(() =>
        {
            return new StackLayout
            {
                Children =
                {
                    new Entry
                    {
                    }.Bind(Entry.TextProperty, path: "Description")
                }
            };
        });
   

        public RecordStock()
        {
            BindingContext = this;

            StockItems.Add(new StockInfo { Description = "Milk" });
            StockItems.Add(new StockInfo { Description = "Cheese" });

            Content = new StackLayout
            {
                Children =
                {
                    new StackLayout
                    {
                    }.Invoke(layout => BindableLayout.SetItemTemplate(layout, StockTemplate))
                    .Bind(BindableLayout.ItemsSourceProperty, path: "StockItems")
                }
            };
        }
    }
}

如果我在StockInfo类的“Description”属性的get/set中放置一个调试器停止行,然后键入Entry,调试器将拾取它并停止程序进行调试。
但是如果我在Observable集合的set/get中的某个地方放置一个调试器stop,程序将不会在其中停止。
不明白为什么。

w9apscun

w9apscun1#

如果使用Collection Add方法,则setter不会触发。
您可以尝试使用CollectionChanged事件处理程序。请尝试以下代码:

StockItems = new ObservableCollection<string>();
StockItems.CollectionChanged += StockItems_CollectionChanged;

private void StockItems_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        // Console.WriteLine("123"); add your logic here
    }

*****此处更新

如果要触发collection中的setter,则必须直接为collection设置一个值,如下所示:

mylist = new List<Item>(); //declare a middle List

//first change mylist, then assign to ItemCollection
ItemCollection = new ObservableCollection<Item>(mylist);

********更新2

在数据模板中,为条目添加一个EventHandler:

new Entry
{
}.Bind(Entry.TextProperty, path: "Description",BindingMode.TwoWay)
.Invoke(entry=>entry.TextChanged+=Entry_TextChanged)

在EventHandler中,您可以添加逻辑(尽管StockItems的setter方法不会被触发,但是值已经被更改)

private void Entry_TextChanged(object sender, TextChangedEventArgs e)
    {
        //add your logic here
    }

有关详细信息,请参阅Xamarin.Forms - CollectionView sample
希望对你有用。

相关问题