Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#xamarin.forms-ListView中的标签在OnPropertyChanged后失去价值-仅在Windows设备上_C#_Windows_Xaml_Xamarin.forms_Observablecollection - Fatal编程技术网

c#xamarin.forms-ListView中的标签在OnPropertyChanged后失去价值-仅在Windows设备上

c#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

项目:

MyApp需要每隔几秒钟刷新一次内容,因此我在主线程中使用异步方法,从数据源获取数据并更新页面中的值

该应用程序按预期在Android emulator上运行,但在Windows设备上,我遇到了一个问题,即在第一次刷新后,ListView中的标签将失去其价值

如果旋转或更改页面,标签将再次可见,直到下次刷新

因此,我将尝试引导您简要了解我的代码:

页面 XAML

<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周围放置一个网格)对我也不起作用-但谢谢!