摆脱布尔标志

问题描述 投票:0回答:1

我真的很欣赏使用

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;
    }
}
maui community-toolkit-mvvm
1个回答
0
投票

正如 @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>
© www.soinside.com 2019 - 2024. All rights reserved.