gpt4 book ai didi

xamarin - 在 Xamarin.Forms 中调用 PropertyChanged 时,UI 上的更新列表不会更改

转载 作者:行者123 更新时间:2023-12-03 10:17:16 24 4
gpt4 key购买 nike

我有一个可绑定(bind)的 StackLayout绑定(bind)到 ListViewModel .当按下按钮时,我正在向列表中添加一个元素,然后调用 PropertyChanged与列表的名称。
我不明白为什么在这种情况下 UI 没有更新。我知道我应该使用 ObservableCollection ,并且我知道该怎么做,但是我很好奇为什么我调用 PropertyChanged 时 UI 不会改变我。
这是 ViewModel 和 Model 类:

    public class Element
{
public string Value { get; set; }
}

public class MainViewModel : INotifyPropertyChanged
{
public List<Element> Elements { get; set; }
public ICommand AddElementCommand { get; private set; }

public event PropertyChangedEventHandler PropertyChanged;

public MainViewModel()
{
AddElementCommand = new Command(AddElement);

Elements = new List<Element>();
Elements.Add(new Element { Value = "test1" });
}

void AddElement()
{
Elements.Add(new Element { Value = "testAgain" });
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Elements"));
}
}
这是观点:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:d="http://xamarin.com/schemas/2014/forms/design"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:Class="TestList.MainPage"
x:Name="page">
<StackLayout>
<StackLayout Orientation="Horizontal">
<Label Text="Elements"
FontSize="Large"
HorizontalOptions="FillAndExpand"
VerticalOptions="Center"/>
<Button Command="{Binding AddElementCommand}"
Text="+" FontSize="Title"
VerticalOptions="Center"/>
</StackLayout>
<StackLayout BindableLayout.ItemsSource="{Binding Elements}">
<BindableLayout.ItemTemplate>
<DataTemplate>
<Entry Text="{Binding Value, Mode=TwoWay}" HorizontalOptions="FillAndExpand"/>
</DataTemplate>
</BindableLayout.ItemTemplate>
</StackLayout>
</StackLayout>
</ContentPage>

最佳答案

如果我们查看 的源代码可观察集合 ,我们会看到它已经实现了 INotifyCollectionChanged INotifyPropertyChanged 默认情况下 列表 没有。

public class ObservableCollection<T> : Collection<T>, INotifyCollectionChanged, INotifyPropertyChanged
public class List<T> : ICollection<T>, IEnumerable<T>, IEnumerable, IList<T>, IReadOnlyCollection<T>, IReadOnlyList<T>, ICollection, IList
如果一个列表将在其整个生命周期中包含相同的项目,但该列表中的各个对象会发生变化,那么仅这些对象就足以引发更改通知(通常通过 INotifyPropertyChanged 列表 足够了。但是如果列表会不时包含不同的对象,或者如果顺序发生变化,那么您应该使用 可观察集合 .
这就是为什么我们总是建议用户选择 可观察集合 而不是 列表 .

关于xamarin - 在 Xamarin.Forms 中调用 PropertyChanged 时,UI 上的更新列表不会更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63225041/

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