MAUI ObservableCollection 未触发转换器

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

我有一个 ObservableCollection 字符串:

public ObservableCollection<string> ChallengePartImageURLs { get; } = new ObservableCollection<string>();

像这样填充/更新:

ChallengePartImageURLs.Clear();
foreach(var url in SelectedChallengePart.ImageURLs) {
    ChallengePartImageURLs.Add(url);
}

UI 更新得很好,但是,当集合更改时不会触发转换器:

IsVisible="{Binding ChallengePartImageURLs, Converter={StaticResource AnyImageCheckConverter}}"

转换器正在工作,因为如果我将 ObservableCollection 更改为 ObservableProperty,它会被完美触发。

我尝试将 Binding 包含到 ObservableProperty 的 ConverterParameter,但它仍然没有触发。

我是否遗漏了什么,或者有没有办法触发转换器?

更新

转换器在 XAML 中声明:

<ContentPage.Resources>
        <ResourceDictionary>
            <converters:AnyImageCheckConverter x:Key="AnyImageCheckConverter"/>
        </ResourceDictionary>
</ContentPage.Resources>

二手:

<CollectionView ItemsSource="{Binding ChallengePartImageURLs}" IsVisible="{Binding ChallengePartImageURLs, Converter={StaticResource AnyImageCheckConverter}}">
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <Label Text="{Binding .}" />
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

转换器本身:

{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        try
        {
            if (value != null)
            {
                var list = (ObservableCollection<string>)value;
                if (list.Count > 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            return false;
        }
        catch (Exception ex)
        {
        }
        return false;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

只能通过清除集合并添加新项目来更改集合。

maui observablecollection
1个回答
0
投票
正如您所发现的,转换器未触发的主要原因是转换器只会在“PropertyChangedEvent”之后运行。当清除、添加或删除项目时,ObservableCollection 会发出

NotifyCollectionChangedAction 对于您的用例来说,这实际上意味着触发属性更改事件,以便在更新集合后运行转换器。这种行为方式的好处是,每次从集合中添加或删除某些内容时,您的页面不会运行转换器。

ChallengePartImageURLs.Clear(); foreach(var url in SelectedChallengePart.ImageURLs) { ChallengePartImageURLs.Add(url); } PropertyChanged(this, new PropertyChangedEventArgs(nameof(ChallengePartImageURLs)));

或者如果您正在使用
MVVM工具包
,您可以简化propteryChanged调用

ChallengePartImageURLs.Clear(); foreach(var url in SelectedChallengePart.ImageURLs) { ChallengePartImageURLs.Add(url); } OnPropertyChanged(nameof(ChallengePartImageURLs));

我希望您觉得这有帮助。我不得不在我的应用程序中多次实现这种行为。我发现扩展 ObservableCollection 来添加此行为非常有益。
    

© www.soinside.com 2019 - 2024. All rights reserved.