我的一个 maui android 项目在一个页面中有一个集合视图。
我像这样设置集合视图的属性:
<CollectionView x:Name="ModelList"
SelectionMode="None"
IsGrouped="False"
ItemSizingStrategy="MeasureAllItems"
ItemsSource="{Binding Models}"
VerticalOptions="FillAndExpand">
<CollectionView.ItemsLayout>
<GridItemsLayout Span="2" Orientation="Vertical"/>
</CollectionView.ItemsLayout>
<CollectionView.ItemTemplate>
<DataTemplate x:DataType="models:Model">
<VerticalStackLayout Spacing="3" HorizontalOptions="Center" Margin="0,0,0,10">
<views:CustomView
x:Name="Cstm"
IsBusy="{Binding IsBusy, Source={RelativeSource AncestorType={x:Type viewmodel:ViewModel}}}" <-- IsBusy property is bindable Property.-->
ControlTemplate="{StaticResource TappedView}">
<views:CustomView.GestureRecognizers>
<TapGestureRecognizer Command="{Binding ModelDetailsPageCommand, Source={RelativeSource AncestorType={x:Type viewmodel:ProjectPageViewModel}}}" CommandParameter="{Binding Id}"/>
</views:CustomView.GestureRecognizers>
</views:CustomView>
</VerticalStackLayout>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
Collection View 的 item 模板使用自定义视图填充,而自定义视图的控件模板是自定义控件。其布局如下:
<ControlTemplate x:Key="CustomControl">
<Border x:Name="CustomLayout">
<Grid>
<Border attached:ControlTappedAttachedProperty.Value="{TemplateBinding IsBusy}"> <--AttachedProperty-->
<Image HeightRequest="60">
<Image.Source>
<FontImageSource FontFamily="Font" Glyph="{x:Static Font.ThereIsAProblem}" Color="{StaticResource YsSomeColor}" />
</Image.Source>
</Image>
</Border>
</Grid>
</Border>
</ControlTemplate>
这将控制附加属性的值与自定义控件的可绑定属性的绑定。
附加属性只是为附加的视觉元素设置动画。
问题就在这里。当点击集合视图中的项目时,所有项目都会动画。而不仅仅是被点击的项目。
尝试过:
- 将选择模式更改为单一不起作用。
- 将附加属性顶部父对象 (Collectionview item ->
<views:CustomView/>
) 附加到自定义控件无效。同样的问题。
所以……我很困惑。任何帮助或想法都将不胜感激。提前致谢。
如果我正确理解了你的问题。在你的代码中,你使用了以下绑定:
这
BindableProperty
已绑定到IsBusy
中的属性ViewModel
。因此,当您点击某个项目并更改其IsBusy
值时,所有项目都会反映此更改,因为它们共享相同的ViewModel-level
IsBusy
属性。为了确保每个项目都有自己的
IsBusy
状态,请考虑向 Model 类添加一个IsBusy
属性。然后,在 tap 事件中,您可以IsBusy
像这样更新特定项目的属性:这样,列表中的每个项目的 IsBusy 状态将是唯一的。