我遇到了一个非常奇怪的问题,试图在CollectionView中打印一个observableCollection对象。我想有一个42块的网格,在每个块中打印一个从1到42的数字。当我点击一个块时,我希望它的背景变成绿色。
下面是我的代码(非常简单):
型号:
public class Case
{
public int Id { get; set; }
public string ColorToPrint { get; set; }
public Case(int id, string color)
{
Id = id;
ColorToPrint = color;
}
}
视图模型:
public ICommand SelectionChangedCommand { get; set; }
public GridViewModel()
{
Cases = new ObservableCollection<Case>();
for (int i=1; i<=42; i++)
{
Case c = new Case(i, "Grey");
Cases.Add(c);
}
SelectionChangedCommand = new Command(OnSelectionChanged);
}
private void OnSelectionChanged()
{
Case c = new Case(SelectedCase.Id, "Green");
Cases[SelectedCase.Id - 1] = c;
}
private ObservableCollection<Case> cases;
public ObservableCollection<Case> Cases
{
get => cases;
set
{
cases = value;
OnPropertyChanged(nameof(Cases));
}
}
private Case selectedCase;
public Case SelectedCase
{
get => selectedCase;
set
{
selectedCase = value;
OnPropertyChanged(nameof(SelectedCase));
}
}
}
和我的页面:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<CollectionView ItemsSource="{Binding Cases}"
SelectionMode="Single"
SelectedItem="{Binding SelectedCase}"
SelectionChangedCommand="{Binding SelectionChangedCommand}"
Grid.Column="0"
Grid.Row="0"
ItemsLayout="VerticalGrid, 6"
Margin="20">
<CollectionView.ItemTemplate>
<DataTemplate>
<Frame Padding="2"
BackgroundColor="Transparent">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup Name="CommonStates">
<VisualState Name="Normal" />
<VisualState Name="Selected">
<VisualState.Setters>
<Setter Property="BackgroundColor" Value="Transparent"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Frame BorderColor="Black"
MinimumHeightRequest="20"
CornerRadius="5"
BackgroundColor="{Binding ColorToPrint}">
<Label Text="{Binding Id}"
TextColor="Black"
FontAttributes="Bold"
FontSize="15"
HorizontalOptions="Center"
VerticalOptions="Center"
/>
</Frame>
</Frame>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</Grid>
当然,在我的page.cs中,视图模型被定义为bindingContext。
所以这段代码运行得很好,但我得到了一个奇怪的行为,如果我点击它(颜色变化很好),擦除块中的数字,如果我点击另一个块,则重新开始。似乎这种行为也是随机发生的,而不是所有的时间。
我整个下午都在寻找解决方案,如果你能给我一些帮助,我将不胜感激。
谢谢大家,原谅我的英语不好。
尝试了不同的方法来更新我的Observablecollection,也尝试了很多关于propertychange事件的事情
1条答案
按热度按时间pod7payv1#
这个问题可以在我这边复制。要解决这个问题,您可以将
CollectionView
中的项目的外部Frame
替换为Grid
或StackLayout
,如下所示: