我的毛伊岛 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>
集合视图的项目模板使用自定义视图填充,并且该自定义视图的控件模板是自定义控件。它的布局是这样的:
<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>
此控件附加属性的值绑定自定义控件的可绑定属性。
附加属性只是对附加的视觉元素进行动画处理。
问题就在这里。当点击集合视图中的项目时,所有项目都会有动画。不只是被窃听的那个。
尝试过:
<views:CustomView/>
)而不是自定义控件无效。同样的问题。所以...我很困惑。任何帮助任何想法都将非常感激。预先感谢。
在您的代码中,您使用以下绑定:
IsBusy="{Binding IsBusy, Source={RelativeSource AncestorType={x:Type viewmodel:ViewModel}}}"
此
BindableProperty
绑定到您的 IsBusy
中的 ViewModel
属性。因此,当您点击某个项目并更改 IsBusy
值时,所有项目都会反映此更改,因为它们共享相同的 ViewModel-level
IsBusy
属性。
为了确保每个项目都可以有自己的
IsBusy
状态,请考虑向模型类添加 IsBusy
属性。然后,在点击事件中,您可以更新特定项目的 IsBusy
属性,如下所示:
model.IsBusy = true;
这样,列表中每个项目的 IsBusy 状态都是唯一的。