当我点击一个项目时,我有一个包含项目的 CollectionView,应该使用删除或更新按钮重定向到详细信息页面。当我进行操作时,我应该如何刷新父collectionview?
CollectionviewPage 的 ViewModel:
public class TestViewModel : BaseViewModel
{
public ObservableCollection<TestItem> TestItems { get; set; }
public TestViewModel()
{
TestItems = new ObservableCollection<TestItem>
{
new TestItem { Id = 1, Title = "Test Item 1" },
new TestItem { Id = 2, Title = "Test Item 2" },
new TestItem { Id = 3, Title = "Test Item 3" }
};
ItemSelectedCommand = new Command(OnItemSelected);
}
[RelayCommand]
private void OnItemSelected(TestItem selectedItem)
{
await Shell.Current.Navigation.PushAsync(new DetailsPage(selectedItem));
}
}
详情页的ViewModel:
public class DetailsPageModel : BaseViewModel
{
TestItem _item;
public TestViewModel(TestItem item)
{
_item = item;
}
[RelayCommand]
private async void Delete()
{
// Mock Delete from db
await _repository.Delete(_item);
await Shell.Current.Navigation.PopAsync();
}
}
因此,在这种情况下,我从数据库中删除该项目,但是我应该如何从详细信息页面通知父级它应该更新?我是否应该将整个列表传递到详细信息页面并从那里删除,似乎没有效果?
我可以为您的实施提供一种快速解决方案,但不是最好的解决方案,在您的构造函数中传递一个操作,并在您想要更新列表时调用。
[RelayCommand]
private void OnItemSelected(TestItem selectedItem)
{
await Shell.Current.Navigation.PushAsync(new DetailsPage(selectedItem, RemoveItem));
}
private void RemoveItem(TestItem selectedItem)
{
TestItems.Remove(selectedItem)
}
详情页:
public class DetailsPageModel : BaseViewModel
{
TestItem _item;
private Action<TestItem> _removeItemAction;
public TestViewModel(TestItem item, Action<TestItem> removeItemAction)
{
_item = item;
_removeItemAction = removeItemAction;
}
[RelayCommand]
private async void Delete()
{
// Mock Delete from db
await _repository.Delete(_item);
_removeItemAction.Invoke(_item);
await Shell.Current.Navigation.PopAsync();
}
}
我建议您开始使用 Shell Navigation 传递数据https://learn.microsoft.com/en-us/dotnet/maui/fundamentals/shell/navigation?view=net-maui-8.0#pass-data