.net maui无法在一个可观察集合中获取更新字段,以便在绑定集合视图中更新



我试图在一个绑定到CollectionView的ObservableCollection中更新实际字段。

CollectionView在添加、删除项时更新得很好,但如果我以编程方式更改列表中的项,则不更新。

我从这篇文章中了解到Observable collection没有更新,我需要实现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");
}
}

和MainPage.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 II lol

G

我只是纠结于为什么我的列表在被编程更新时没有更新。我发现的一个更简单的方法(至少对我来说)是使用Microsoft的CommunityToolkit进行如下配置。对于Model,让类继承"observableobject"。然后用"[ObservableProperty]"标记属性。

namespace TestCollectionBinding.Views;
public partial class MyItem : ObservableObject
{
[ObservableProperty]  
string name;
[ObservableProperty]
string device;
}

在您的ViewModel "ViewModels.MainPageViewModel.cs"中,设置要显示的集合如下。对于那些不懂的人,不要使用"List myitem ",而是将其设置为"ObservableCollection myitem "因为这不会以编程方式更新。我希望有人能解释为什么列表不更新,尽管被OnPropertyChanged("ListName")提出。

[ObservableProperty]
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"
}
};

您将需要配置您的VIEW以在您的"mainpage . example"上使用CommunityToolkit。我将引用添加到:xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit">

<?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"
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
x:Class="TestCollectionBinding.MainPage">

我刚刚花了一整天的时间试图弄清楚为什么我的LIST没有更新VIEW。我想我应该为其他偶然发现这个问题的人发布一个解决方案。总之,用"[ObservableProperty]&quot标记MODEL属性。利用"ObservableProperty"在VIEWMODEL中。然后确保VIEW设置为使用来自Microsoft的CommunityToolkit,您可以从Github获得。

使管道更清洁。

from the docs

public class MyItem : ObservableObject
{
private string name;
public string Name
{
get => name;
set => SetProperty(ref name, value);
}
}

根据@Jason (ta)的有用提示,我搜索了一下,发现了这个非常有用的解释:https://learn.microsoft.com/en-us/windows/communitytoolkit/mvvm/observableobject

My MyItem.cs现在看起来像:

public partial class MyItem : ObservableObject
{
private string name;
private string device;
public string Name { 
get => name; 
set => SetProperty(ref name, value); 
}
public string Device { 
get => device; 
set => SetProperty(ref device, value); 
}
}

这比我想象的要复杂得多…我不得不问,为什么这些东西如此难以理解,我认为编程应该随着时间的推移变得更容易?我本以为,如果一个设备连接到一个列表,那么它应该(神奇地)工作,而不需要隐藏所有的管道。如果您不想更改任何内容,请将其设置为只读!:叹息。有一天,当我死了,被埋葬……

相关内容

  • 没有找到相关文章

最新更新