Вопрос или проблема
Я создал представление коллекции, чтобы оно напоминало таблицу данных, и всё работает, кроме подсветки выбранного элемента. Я пытался изменить цвет с помощью менеджеров визуальных состояний, но всё равно ничего не получилось. Я разрабатываю это для приложения Windows, поэтому меня беспокоит только его работа на Windows. Выбранный элемент все еще работает, просто не подсвечивается. Что я делаю не так?
<CollectionView
x:Name="CollectionOfItems"
ItemsSource="{Binding Items}"
Header="{Binding .}"
Grid.Row="2"
Grid.Column="0"
BackgroundColor="Grey"
Margin="20,0,0,0"
WidthRequest="1750"
HorizontalOptions="Start"
VerticalOptions="Start"
SelectionMode="Single"
SelectedItem="{Binding SelectedItem}">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup Name="CommonStates">
<VisualState Name="Normal"></VisualState>
<VisualState Name="Selected">
<VisualState.Setters>
<Setter Property="BackgroundColor" Value="LightBlue"></Setter>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<CollectionView.ItemTemplate>
<DataTemplate x:DataType="m:Item">
<Grid
Margin="0"
RowDefinitions="*"
ColumnDefinitions="*,*,*,*,*">
<Frame
x:Name="SerialNumberFrame"
CornerRadius="0"
BorderColor="Black"
Grid.Column="0"
BackgroundColor="white">
<Label
Text="{Binding SerialNumber}"
HorizontalOptions="Start">
</Label>
</Frame>
<Frame
CornerRadius="0"
BorderColor="Black"
BackgroundColor="LightGrey"
Grid.Column="1">
<Label
Text="{Binding ItemType.Text}"
HorizontalOptions="Start">
</Label>
</Frame>
<Frame
CornerRadius="0"
BorderColor="Black"
BackgroundColor="white"
Grid.Column="2">
<Label
Text="{Binding HasAllComponents.Text}"
HorizontalOptions="Start">
</Label>
</Frame>
<Frame
CornerRadius="0"
BorderColor="Black"
BackgroundColor="LightGrey"
Grid.Column="3">
<Label
Text="{Binding MissionCapable.Text}"
HorizontalOptions="Start">
</Label>
</Frame>
<Frame
CornerRadius="0"
BorderColor="Black"
BackgroundColor="White"
Grid.Column="4">
<Label
Text="{Binding CheckedOut.Text}"
HorizontalOptions="Start">
</Label>
</Frame>
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
Я пробовал использовать менеджеры визуальных состояний. Я все еще новичок и не совсем уверен, что еще попробовать. Насколько я знаю, выбранный элемент должен подсвечиваться автоматически.
Ответ или решение
Проблема, с которой вы столкнулись при использовании CollectionView
в .NET MAUI для выделения выбранных элементов, может быть связана с тем, как вы используете визуальные состояния и связываете их с элементами вашего шаблона данных. В вашем случае Selected
состояние должно быть применено непосредственно к элементу, который вы хотите стилизовать при выборе.
Вот некоторые шаги и корректировки, которые могут помочь вам в решении этой проблемы:
-
Обновите шаблон данных: Вместо того чтобы пытаться применить состояние выделения напрямую к
CollectionView
, примените его к элементам внутри вашегоDataTemplate
. Для этого вы можете использовать триггеры состояний и задать визуальные состояния для элементов внутри вашего шаблона данных. -
Используйте
DataTrigger
: Отображение состояния выделения можно реализовать с помощью привязки к свойствуCollectionView.SelectedItem
. Вот как это можно сделать:
<CollectionView
x:Name="CollectionOfItems"
ItemsSource="{Binding Items}"
SelectedItem="{Binding SelectedItem}"
SelectionMode="Single"
BackgroundColor="Grey"
Margin="20,0,0,0"
WidthRequest="1750"
HorizontalOptions="Start"
VerticalOptions="Start">
<CollectionView.ItemTemplate>
<DataTemplate x:DataType="m:Item">
<Grid Margin="0" RowDefinitions="*" ColumnDefinitions="*,*,*,*,*">
<Frame
x:Name="SerialNumberFrame"
CornerRadius="0"
BorderColor="Black"
BackgroundColor="white"
Grid.Column="0">
<Label Text="{Binding SerialNumber}" HorizontalOptions="Start"/>
</Frame>
<Frame
CornerRadius="0"
BorderColor="Black"
BackgroundColor="LightGrey"
Grid.Column="1">
<Label Text="{Binding ItemType.Text}" HorizontalOptions="Start"/>
</Frame>
<Frame
CornerRadius="0"
BorderColor="Black"
BackgroundColor="white"
Grid.Column="2">
<Label Text="{Binding HasAllComponents.Text}" HorizontalOptions="Start"/>
</Frame>
<Frame
CornerRadius="0"
BorderColor="Black"
BackgroundColor="LightGrey"
Grid.Column="3">
<Label Text="{Binding MissionCapable.Text}" HorizontalOptions="Start"/>
</Frame>
<Frame
CornerRadius="0"
BorderColor="Black"
BackgroundColor="White"
Grid.Column="4">
<Label Text="{Binding CheckedOut.Text}" HorizontalOptions="Start"/>
</Frame>
</Grid>
<DataTemplate.Triggers>
<DataTrigger TargetType="Grid" Binding="{Binding Source={x:Reference CollectionOfItems}, Path=SelectedItem}" Value="{Binding}">
<Setter Property="BackgroundColor" Value="LightBlue"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
В этом коде применяется триггер для изменения цвета фона всего элемента Grid
, когда он совпадает с SelectedItem
из CollectionView
.
-
Проверка на правильность привязки: Убедитесь, что
SelectedItem
правильно привязывается к выбранному элементу из коллекции и что вы используете механизм привязки INotifyPropertyChanged, чтобы обновления были видимыми. -
Тестирование и отладка: После внесения этих изменений протестируйте ваше приложение заново. Если выделение работает, то вы должны видеть, что фон выбранного элемента изменяется на
LightBlue
.
При соблюдении этих шагов выделение выбранного элемента в CollectionView
должно работать корректно. Не стесняйтесь задавать дополнительные вопросы, если потребуется дальнейшая помощь.