我有一个 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();
}
}
只能通过清除集合并添加新项目来更改集合。
NotifyCollectionChangedAction。 对于您的用例来说,这实际上意味着触发属性更改事件,以便在更新集合后运行转换器。这种行为方式的好处是,每次从集合中添加或删除某些内容时,您的页面不会运行转换器。
ChallengePartImageURLs.Clear();
foreach(var url in SelectedChallengePart.ImageURLs) {
ChallengePartImageURLs.Add(url);
}
PropertyChanged(this, new PropertyChangedEventArgs(nameof(ChallengePartImageURLs)));
或者如果您正在使用
MVVM工具包,您可以简化propteryChanged调用我希望您觉得这有帮助。我不得不在我的应用程序中多次实现这种行为。我发现扩展 ObservableCollection 来添加此行为非常有益。