

MAUIのCollectionViewで、選択時に項目の見た目を変えたいです。[公式のドキュメント](https://docs.microsoft.com/ja-
jp/dotnet/maui/user-
interface/controls/collectionview/selection?source=recommendations)で選択項目の色を変える例が示されていますが、この方法による変化は限定的で、もっと自由に、DataTemplateの中身を変更したいと思っています。現在このようなCollectionViewを例に調べています。

[code]

    <CollectionView x:Name="collectionView" SelectionMode="Single" Background="lightgray" SelectionChanged="collectionView_SelectionChanged" local:IsSelectedBehavior.IsSelected="True">
        <CollectionView.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <Label Text="{Binding Name}" VerticalTextAlignment="Center" Margin="16,0,0,0"/>
                    <CheckBox Grid.Column="1" IsChecked="{Binding IsSelected}"/>
                    <Rectangle Grid.Column="2">
                        <Rectangle.Style>
                            <Style TargetType="Rectangle" x:Name="rectangle">
                                <Setter Property="Fill" Value="red"/>
                                <Style.Triggers>
                                    <DataTrigger TargetType="Rectangle" Binding="{Binding IsSelected}" Value="true">
                                        <Setter Property="Fill" Value="green"/>
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </Rectangle.Style>
                    </Rectangle>
                    <Grid.GestureRecognizers>
                        <TapGestureRecognizer Tapped="TapGestureRecognizer_Tapped"/>
                    </Grid.GestureRecognizers>
                </Grid>
            </DataTemplate>
        </CollectionView.ItemTemplate>
    </CollectionView>
    
[/code]

ItemsSourceはコードビハインドから入れています。コレクションのアイテムクラスにIsSelectedプロパティが定義されており、TapGestureRecognizer_Tappedで、ItemsSourceのオブジェクトにアクセスしてこのプロパティを変更することで、各項目が選択されていることを認識できるようにしています。このコードで、選択時にRectangleの色を替える、ということは実現しています。

**これと同じことを、View単体で完結させたいです。アイテムクラスにIsSelectedプロパティを定義したくありません。**

これを実現するため、以下のことを試しました。  
・添付プロパティを自作して、IsSelectedの代わりに使う  
これは、プロパティを設定するところと、添付プロパティにバインディングするところで躓きました。自作した添付プロパティはCollectionのItemコントロールに設定しなければならないと思いましたが、CollectionViewはWPFで言う所のItemContainerGeneratorを公開していないため、子のコントロールを取得できませんでした。また添付プロパティのバインディングに関しては、そもそもバインドが全く機能しませんでした。MAUIでは添付プロパティに対するバインディングはできませんか？

・VisualStateManagerを使う  
DataTemplate直下のGridコントロールにVSMを定義し、ここから[このリンクの方法で](https://docs.microsoft.com/ja-
jp/xamarin/xamarin-forms/user-interface/visual-state-
manager)、Rectangleの見た目を変えようとしました。しかし選択した瞬間に例外が発生し、うまく切り替わりませんでした。どこで何の例外が発生したのか、デバッガで確認できませんでした。

VisualStudio 17.3.0 Preview 6.0を使用しています。  
よろしくお願いします。


CC BY-SA 4.0
2022-08-27T10:39:01.067
90794
2022-09-07T08:59:47.653
2022-09-07T08:59:47.653
54170
54170
question
xaml xamarin.forms
MAUIのCollectionViewで、選択時に項目の見た目を変えたい