我有一个用产品填充的集合。一旦填充了集合,绑定到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,程序将不会在其中停止。
不明白为什么。
1条答案
按热度按时间w9apscun1#
如果使用Collection Add方法,则setter不会触发。
您可以尝试使用CollectionChanged事件处理程序。请尝试以下代码:
*****此处更新
如果要触发collection中的setter,则必须直接为collection设置一个值,如下所示:
********更新2
在数据模板中,为条目添加一个EventHandler:
在EventHandler中,您可以添加逻辑(尽管StockItems的setter方法不会被触发,但是值已经被更改)
有关详细信息,请参阅Xamarin.Forms - CollectionView sample
希望对你有用。