我真的很欣赏使用
CanExecute
、NotifyCanExecuteChangedFor
和 AsyncRelayCommand<T>.IsRunning
属性来运行/停止 ActivityIndicator 并禁用/启用命令按钮的组合,而无需跟踪整个 ViewModel 的布尔属性,如此处所述优秀的博客文章。
但是,我想知道,所有其他标志怎么样?
例如,以下代码示例支持包含单个选取器控件的 XAML 文件(此处没有按钮)。在加载集合之前,需要运行 ActivityIndicator 并且必须禁用 Picker,而在加载集合之后,标志会反转。随着应用程序变得复杂,必须添加其他标志。
有没有更好的方法来完成这些任务而不依赖布尔标志?
public partial class TestViewModel: ObservableObject
{
[ObservableProperty]
private Book _selectedBook;
[ObservableProperty]
ObservableCollection<Book> _books;
[ObservableProperty]
bool _showIndicator;
[ObservableProperty]
bool _pickerEnabled;
public TestViewModel()
{
BooksService();
}
async Task BooksService()
{
ShowIndicator = true;
PickerEnabled = false; //by default
await Task.Delay(TimeSpan.FromSeconds(5));
Books = await FetchBooks();
ShowIndicator = false;
PickerEnabled = true;
}
}
正如 @LiqunShen-MSFT 在评论中建议的那样,我最终依赖于转换器。但我没有自己编写,而是使用了 .NET Maui Community Toolkit 中提供的预构建工具。具体来说是 IsListNullOrEmptyConverter 和 IsListNotNullOrEmptyConverter。
<Grid>
<VerticalStackLayout Padding="20" Spacing="20" VerticalOptions="Fill">
<Picker Title="Select Book"
ItemsSource="{Binding Books}"
IsEnabled="{Binding Books,
Converter={StaticResource IsListNotNullOrEmptyConverter}}" />
</VerticalStackLayout>
<ActivityIndicator
IsVisible="{Binding Books,
Converter={StaticResource IsListNullOrEmptyConverter}}"
IsRunning="{Binding Books,
Converter={StaticResource IsListNullOrEmptyConverter}}" />
</Grid>