我只是想捕获可观察集合中的一个项目并更改其道具之一:
public void Click(object obj)
{
Device.InvokeOnMainThreadAsync(() =>
{
if (obj != null)
{
var click = obj as WifiSelectionModel;
if (click == null) return;
click.IsActive = true;
}
OnPropertyChanged(nameof(WifiHotSpots));
});
我的类继承自:ObservableObject,
如果我单击,用户界面中不会发生任何变化(它应该变成红色)。 但如果我离开页面并返回;这些物品现在都是红色的。所以我的逻辑一定是正确的,只是我在 mvvm 中处理 UI 的方式似乎不对。 有什么帮助吗?
VM:
public class WifiSelectionModel
{
public string Name { get; set; } = "";
public bool IsActive { get; set; } = false;
public int Id { get; set; }
}
查看:
<CollectionView SelectionMode="Single" VerticalOptions="FillAndExpand" ItemsSource="{Binding WifiHotSpots}">
<CollectionView.ItemTemplate>
<DataTemplate x:DataType="Models:WifiSelectionModel">
<Grid Padding="10">
<Grid.RowDefinitions>
<RowDefinition Height="50"></RowDefinition>
<RowDefinition Height="50"></RowDefinition>
</Grid.RowDefinitions>
<Grid.GestureRecognizers>
<TapGestureRecognizer Command="{Binding BindingContext.ClickCommand, Source={x:Reference WifiPageViewPage}}" CommandParameter="{Binding .}"/>
</Grid.GestureRecognizers>
<Label Grid.Row="0" Text="{Binding Name}" FontAttributes="Bold" />
<StackLayout HeightRequest="50" IsVisible="{Binding IsActive}" BackgroundColor="Red" Grid.Row="1">
<Label Text="hi mom"></Label>
</StackLayout>
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
来自ObservableObject的文档:
简单属性
以下是如何对自定义属性实现通知支持的示例:
private string name;
public string Name
{
get => name;
set => SetProperty(ref name, value);
}
我对 MAUI 不熟悉,但你的
WifiSelectionModel.IsActive.set
似乎缺少任何通知 UI 它已更改的内容,这可能就是更改被忽略的原因。 WifiSelectionModel
也应该继承自 ObservableObject,UI 使用的每个视图模型也应该继承。
有多种不同的模式用于通知 UI 更改,具体取决于使用的框架和库。但需要有一些某些东西,例如引发事件、使用属性上的属性或调用方法。