gpt4 book ai didi

mvvm - 更改ObservableCollection的属性不起作用

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

在我的Xamarin项目中,我有一个ListView,由一个ObservableCollection填充,该容器包含具有某些属性的“Item”对象。如果将项目添加到集合中,则UI会更新,但是如果仅更改属性,则不会执行任何操作。即使通过添加项更新UI后,也不会执行任何操作,尽管属性已正确更改。如果更改了属性,如何使UI刷新?

BindableBase是PRISM中的一个类,实现INotifyPropertyChanged,而DelegateCommand则实现ICommand,btw。

这是我的XAML:

<ListView ItemsSource="{Binding ListItems}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell x:Name="viewCell">
<ContentView Padding="0,0,0,5"
HeightRequest="50">
<ContentView.GestureRecognizers>
<TapGestureRecognizer BindingContext="{Binding Source={x:Reference listView}, Path=BindingContext}"
Command="{Binding ItemTappedCommand}"
CommandParameter="{Binding Source={x:Reference viewCell}, Path=BindingContext}" />
</ContentView.GestureRecognizers>
<Frame OutlineColor="{Binding Color}" Padding="8">
<StackLayout Orientation="Horizontal" >
<Image x:Name="checkedImage"
HeightRequest="30"
WidthRequest="30"
BackgroundColor="{Binding Color}"
/>
<Label Text="{Binding Text}"
TextColor="{Binding Color}"
Margin="20,0,0,0"
VerticalTextAlignment="Center"
HorizontalOptions="FillAndExpand"/>
<Image Source="{Binding Image}" />
</StackLayout>
</Frame>
</ContentView>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>

这是我的ViewModel:
public class DetailPageViewModel : BindableBase
{
public DetailPageViewModel()
{
_listItems.Add(new ViewModels.Item("#123456", "Test1", "XamarinForms.Assets.Yellow.png"));
_listItems.Add(new ViewModels.Item("#654321", "Test3", "XamarinForms.Assets.close.png"));
}

private ObservableCollection<Item> _listItems = new ObservableCollection<Item>();

public ObservableCollection<Item> ListItems
{
get { return _listItems; }
set { SetProperty(ref _listItems, value); }
}

public DelegateCommand<Item> ItemTappedCommand => new DelegateCommand<Item>(ItemTapped);

private void ItemTapped(Item listItem)
{
// Adding an item refreshes the UI.

_listItems.Add(new ViewModels.Item("#654321", "Test3", "XamarinForms.Assets.close.png"));

// But changing the color of an item does nothing. Not even after an UI refresh.

_listItems.ElementAt(_listItems.IndexOf(listItem)).Color="#987654";
}
}

而我的Item类:
    public class Item
{
public string Color { set; get; }
public ImageSource Check { set; get; }
public string Text { private set; get; }
public ImageSource Image { private set; get; }


public Item(string color, string text, string imageSource)
{
Check = ImageSource.FromResource("XamarinForms.Assets.checkmark-outlined-verification-sign.png");

Color = color;
Text = text;
Image = ImageSource.FromResource(imageSource);
}

}

最佳答案

这是因为您的项目类也需要实现INotifyPropertyChanged。在使用Prism的情况下,您只需要使您的项目类扩展BindableBase(已为您实现INotifyPropertyChanged的Prism基类)。

链接:https://github.com/PrismLibrary/Prism/blob/a60d38013c02b60807e9287db9ba7f7506af0e84/Source/Prism/Mvvm/BindableBase.cs

那应该使它工作。

我也看到你在这样做:

public ObservableCollection<Item> ListItems
{
get { return _listItems; }
set { SetProperty(ref _listItems, value); }
}

使用ObservableCollections,您无需手动引发事件,因为它们已经在内部进行了。可以将它们定义为常规属性。
public ObservableCollection<Item> ListItems {get; set;}

关于mvvm - 更改ObservableCollection的属性不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41774798/

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