c#xamarin.forms-ListView中的标签在OnPropertyChanged后失去价值-仅在Windows设备上
项目: MyApp需要每隔几秒钟刷新一次内容,因此我在主线程中使用异步方法,从数据源获取数据并更新页面中的值 该应用程序按预期在Android emulator上运行,但在Windows设备上,我遇到了一个问题,即在第一次刷新后,ListView中的标签将失去其价值 如果旋转或更改页面,标签将再次可见,直到下次刷新 因此,我将尝试引导您简要了解我的代码: 页面 XAMLc#xamarin.forms-ListView中的标签在OnPropertyChanged后失去价值-仅在Windows设备上,c#,windows,xaml,xamarin.forms,observablecollection,C#,Windows,Xaml,Xamarin.forms,Observablecollection,项目: MyApp需要每隔几秒钟刷新一次内容,因此我在主线程中使用异步方法,从数据源获取数据并更新页面中的值 该应用程序按预期在Android emulator上运行,但在Windows设备上,我遇到了一个问题,即在第一次刷新后,ListView中的标签将失去其价值 如果旋转或更改页面,标签将再次可见,直到下次刷新 因此,我将尝试引导您简要了解我的代码: 页面 XAML <pages:BasePage.Content> <StackLayout x:Name="Layo
<pages:BasePage.Content>
<StackLayout x:Name="Layout" Orientation="Vertical" VerticalOptions="StartAndExpand"
HorizontalOptions="FillAndExpand">
<ListView x:Name="ItemListView" />
</StackLayout>
</pages:BasePage.Content>
ListView肋细胞
public class ItemListCell : ViewCell
{
public ItemListCell()
{
var nameLabel = new Label
{
FontFamily = "HelveticaNeue-Medium",
FontSize = 30,
TextColor = Color.White,
WidthRequest = 500,
HeightRequest = 40,
MinimumWidthRequest = 500,
MinimumHeightRequest = 40
};
nameLabel.SetBinding(Label.TextProperty, "Name");
var cellLayout = new StackLayout
{
Spacing = 0,
Padding = new Thickness(10, 5, 10, 5),
Orientation = StackOrientation.Horizontal,
HorizontalOptions = LayoutOptions.FillAndExpand,
Children = {nameLabel}
};
View = cellLayout;
}
}
public ObservableCollection<ItemListModel> ObservableItems { get; }
public async void Refresh()
{
var items = await DataSource.GetItemList();
foreach (var item in items)
{
var od = ObservableItems.FirstOrDefault(i => i.Id == item.Id);
if (od == null)
{
ObservableItems.Add(item);
}
else
{
if (od.Name != item.Name)
{
od.Name = item.Name;
od.OnPropertyChanged("Name");
}
}
}
}
所以这里基本上都是这样,在xaml中我有一个ListView,在后面的代码中我设置了ItemsSource和ItemTemplate
页面中的刷新过程
internal Action RunAction { get; set; }
private void StartRefresh()
{
Device.BeginInvokeOnMainThread(() =>
{
RunAction();
});
}
public async void Run()
{
while (true)
{
ViewModel.Refresh();
await Task.Delay(5000);
}
}
protected override void OnAppearing()
{
base.OnAppearing();
StartRefresh();
}
视图模型
public class ItemListCell : ViewCell
{
public ItemListCell()
{
var nameLabel = new Label
{
FontFamily = "HelveticaNeue-Medium",
FontSize = 30,
TextColor = Color.White,
WidthRequest = 500,
HeightRequest = 40,
MinimumWidthRequest = 500,
MinimumHeightRequest = 40
};
nameLabel.SetBinding(Label.TextProperty, "Name");
var cellLayout = new StackLayout
{
Spacing = 0,
Padding = new Thickness(10, 5, 10, 5),
Orientation = StackOrientation.Horizontal,
HorizontalOptions = LayoutOptions.FillAndExpand,
Children = {nameLabel}
};
View = cellLayout;
}
}
public ObservableCollection<ItemListModel> ObservableItems { get; }
public async void Refresh()
{
var items = await DataSource.GetItemList();
foreach (var item in items)
{
var od = ObservableItems.FirstOrDefault(i => i.Id == item.Id);
if (od == null)
{
ObservableItems.Add(item);
}
else
{
if (od.Name != item.Name)
{
od.Name = item.Name;
od.OnPropertyChanged("Name");
}
}
}
}
那么基本上会发生什么:当页面初始化时,它将RunAction设置为Run(),当页面出现时,它启动StartRefresh()方法
现在Run()方法在主线程中运行,每5秒刷新ViewModel中的ObservableList
总的来说,我不明白为什么ListView中的标签会降低这个值
我希望你们中的一个能帮上忙
调试输出
TestPage.Ctor
TestPage.OnAppearing
TestPage.RefreshStart
TestViewModel.正在刷新
TestViewModel.正在刷新
ItemListModel.OnPropertyChanged:Id[2],名称
线程0x2218已退出,代码为0(0x0)
线程0x1984已退出,代码为0(0x0)
TestViewModel.正在刷新
编辑。对于这些情况,是否有特定于windows的渲染方法或Costam Control/方法
非常感谢 在Windows上,您是否已逐步调试,尤其是刷新方法?只是为了查看该方法是否被调用并按预期工作。是的,我还在每个重要调用(例如在propertychanged中)中添加了Debug.WriteLine(),并检查了标签本身,为其指定了背景色,即使是一个框架来检查大小,如果整个标签掉了,或者只是文本,你的ObservableCollection是只读的,也就是说,只有getter?如果设置程序没有破坏您的逻辑,请尝试添加设置程序。此外,我刚刚读到这篇文章:,可能是布局问题。尝试旋转你的手机/窗口/模拟器以查看GUI是否更新。是的,如果你旋转或更改页面,它将再次返回5秒钟,然后在observable上再次显示DissibleSetter不会更改某些内容,并且引用的链接(在listview周围放置一个网格)对我也不起作用-但谢谢!在Windows上,您是否已逐步调试,尤其是刷新方法?只是为了查看该方法是否被调用并按预期工作。是的,我还在每个重要调用(例如在propertychanged中)中添加了Debug.WriteLine(),并检查了标签本身,为其指定了背景色,即使是一个框架来检查大小,如果整个标签掉了,或者只是文本,你的ObservableCollection是只读的,也就是说,只有getter?如果设置程序没有破坏您的逻辑,请尝试添加设置程序。此外,我刚刚读到这篇文章:,可能是布局问题。尝试旋转你的手机/窗口/模拟器以查看GUI是否更新。是的,如果你旋转或更改页面,它将再次返回5秒钟,然后在observable上再次显示DissibleSetter不会更改某些内容,并且引用的链接(在listview周围放置一个网格)对我也不起作用-但谢谢!