gpt4 book ai didi

xamarin.forms - ItemsSource 更改时选择器不更新

转载 作者:行者123 更新时间:2023-12-04 12:25:42 26 4
gpt4 key购买 nike

我有一个 Xamarin.Forms(3.2,最新版本)Picker实现为

<Picker x:Name="ClassSelector"
Title="Select Class"
ItemsSource="{Binding Classrooms}"
ItemDisplayBinding="{Binding ClassroomName}"
SelectedItem="{Binding SelectedClassroom}">
</Picker>

BindingContext 是这个 ViewModel:
public class ClassroomsViewModel : BaseViewModel
{
public ObservableCollection<Classroom> Classrooms { get; set; }

public ClassroomsViewModel()
{
Classrooms = new ObservableCollection<Classroom>(_ClassroomsRepository.GetAll());
}
}

现在,当我在 ViewModel 中添加教室时,选择器尽职尽责地将项目添加到其列表中:
 Classrooms.Add(new Classroom() { ClassroomName = "test" });   // this works fine

但是如果我修改一个教室, Picker不更新其项目列表:
Classrooms[0].ClassroomName = "test";  // this doesn't have an effect,
// although the value is set
// in the ObservableCollection

我也试过明确调用:
    OnPropertyChanged();  // nothing
OnPropertyChanged("Classrooms"); // nope

如果重要, Classroom确实源自 ObservableObject :
public class Classroom : ObservableObject
{
private string classroomName;

public string ClassroomName { get => classroomName; set => SetProperty(ref classroomName, value); }
}

编辑,其中我澄清这不是集合替换问题:

请注意,我不会替换 Classrooms带有新 ObservableCollection 的集合——就像在其他可能与我的问题类似的帖子中发生的那样。我只是在修改集合的成员之一。当此集合绑定(bind)到不同的控件(如 ListView )时,它的行为完全符合预期—— ListView更新以反射(reflect)新 ClassroomName .

谁能指出我做错了什么?

最佳答案

通常,当我们使用绑定(bind)时,我们希望目标(一个选择器项目)与绑定(bind)源(在本例中为 Classroom 对象)保持同步——因此,按照设计,您的代码是正确的。

然而,在深入研究Picker之后XF github 中的源代码 - 在从 Binding 中提取第一个值后,它似乎取消了绑定(bind)/属性更改的订阅. Here you can see the explicit call to UnApply() 到绑定(bind),然后到选择器项目显示名称的绑定(bind)表达式。

调用 OnPropertyChanged("Classrooms");CustomerViewModel (不在 Customer 上)在技术上应该有效。或者,您可以尝试删除修改后的 Customer集合中的对象,并在相同的索引处重新添加以解决此问题。这两个操作都会触发 ResetItems() - 这反过来应该触发 picker-item's display name 的刷新.

关于xamarin.forms - ItemsSource 更改时选择器不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52796368/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com