我正在尝试更新绑定到CollectionView的ObservableCollection中的实际字段。
CollectionView在添加、移除项时更新良好,但如果我以编程方式更改列表中的项,则不会。
我从这篇文章Observable collection not updated中了解到我需要实现INotifyPropertyChanged。
我正在使用CommunityToolkit.mvvm,我希望这种魔法能自动完成,但似乎没有。我没有C#知识,不知道如何做我想做的事情。有人能帮助我吗:)
在https://github.com/gfmoore/TestCollectionBinding处存在回购
这是我现在的代码:
Views.MyItem.cs
namespace TestCollectionBinding.Views;
public class MyItem
{
public string Name { get; set; }
public string Device { get; set; }
}
ViewModels.MainPageViewModel.cs
using CommunityToolkit.Mvvm.ComponentModel;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using TestCollectionBinding.Views;
namespace TestCollectionBinding.ViewModels;
public partial class MainPageViewModel : ObservableObject
{
[ObservableProperty]
public ObservableCollection<MyItem> myItems = new()
{
new MyItem
{
Name = "Heart Rate Monitor",
Device = "12:12:12:12:AB"
},
new MyItem
{
Name = "Cadence",
Device = "34:34:34:34:CD"
}
};
//show details
public ICommand ChangeCommand => new Command(ChangeControl);
public void ChangeControl()
{
//change device
foreach (MyItem q in MyItems)
{
q.Device = "***********";
}
Console.WriteLine($"Change device");
}
}
和主页.xaml
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:TestCollectionBinding.ViewModels"
x:Class="TestCollectionBinding.MainPage">
<ContentPage.BindingContext>
<local:MainPageViewModel />
</ContentPage.BindingContext>
<StackLayout>
<Label Text="Items"
FontSize="20"
TextColor="Blue"/>
<CollectionView x:Name="MyItemsList"
ItemsSource="{Binding MyItems}">
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid
Margin="10, 0, 10, 10"
ColumnDefinitions="200, 200">
<Label Grid.Column="0"
Text="{Binding Name}"
FontSize="20"/>
<Label Grid.Column="1"
Text="{Binding Device}"
FontSize="20"/>
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
<Button
Text="Change device names"
FontFamily="20"
WidthRequest="150"
Command="{Binding ChangeCommand}" />
</StackLayout>
</ContentPage>
所以MainPage在列表中显示两个项目,当我点击按钮时,命令在列表中循环,只是将Device属性替换为“********"。
我希望在显示的列表中看到这些更改。
哦,对于天的... dBase二lol
G级
3条答案
按热度按时间bqjvbblv1#
从文件中
wlsrxk512#
根据@Jason(ta)的提示,我更努力地搜索,在源代码中找到了这个非常有用的解释:https://learn.microsoft.com/en-us/windows/communitytoolkit/mvvm/observableobject
我的MyItem.cs现在看起来像:
它比我想象的要复杂得多......我不得不问,为什么这些东西如此难以理解,我以为编码应该在这些年里变得更容易吗?我会期望,如果一个设备连接到一个列表,那么它应该只是(神奇地)工作,而不需要所有的管道,应该隐藏在视线之外。如果你不想改变任何东西,让它只读!:叹息。有一天当我死了,埋了......
k4aesqcs3#
我只是在纠结为什么我的列表在程序更新时没有更新。我发现(至少对我来说)一个更简单的方法是使用微软的CommunityToolkit如下配置它。对于模型,让类继承自“ObservableObject”。然后用“[ObservableProperty]"标记属性。
在你的视图模型“ViewModels.MainPageViewModel.cs”上,设置集合显示如下。对于其他不了解的人,不要使用“List myItems”,而是将其设置为“ObservableCollection myItems”,因为这不会以编程方式更新。我希望有人能解释为什么列表没有更新,尽管是由OnPropertyChanged(“ListName”)引发的。
您可能需要配置VIEW以使用“MainPage.xaml”上的CommunityToolkit。我添加了对以下内容的引用:xmlns:工具包=”http://schemas.microsoft.com/dotnet/2022/maui/toolkit“
我刚刚花了一整天的时间试图弄清楚为什么我的LIST没有更新VIEW。我想我会发布一个解决方案给其他遇到这个问题的人。总之,用“[ObservableProperty]"标记模型属性。在VIEWMODEL中使用“ObservableProperty”。然后确保VIEW设置为使用微软的CommunityToolkit,你可以从Github获得。
使得管道清洁得多。