如何在Xamarin表单中分别在ListView的所有项中运行StartTimer

如何在Xamarin表单中分别在ListView的所有项中运行StartTimer,listview,xamarin.forms,Listview,Xamarin.forms,我试着运行5个城市的时钟,比如listview每个单元格中的每个城市,时钟(本地时间)在城市名称之外运行。(截图附在下面) 我使用该城市的偏移值得到该城市的当地时间 为了让时钟移动,我使用了StartTimer,所以时间每秒钟都会改变 目前,我得到的偏移值为零,因此所有城市的UTC时间相同 我希望所有城市的名字旁边都显示当地时间,时钟必须每秒钟移动一次 任何帮助都将不胜感激。。 提前谢谢 List items=newlist(); 添加(新的OffsetItems(){CityName=“Hy

我试着运行5个城市的时钟,比如listview每个单元格中的每个城市,时钟(本地时间)在城市名称之外运行。(截图附在下面)

我使用该城市的偏移值得到该城市的当地时间

为了让时钟移动,我使用了StartTimer,所以时间每秒钟都会改变

目前,我得到的偏移值为零,因此所有城市的UTC时间相同

我希望所有城市的名字旁边都显示当地时间,时钟必须每秒钟移动一次

任何帮助都将不胜感激。。 提前谢谢

List items=newlist();
添加(新的OffsetItems(){CityName=“Hyderabad”,Offset=5.5});
添加(新的OffsetItems(){CityName=“London”,Offset=1});
添加(新的OffsetItems(){CityName=“Tokyo”,Offset=9});
添加(新的OffsetItems(){CityName=“newyork”,Offset=-5});
添加(新的OffsetItems(){CityName=“Dubai”,Offset=4});
ListView lv=新建ListView
{
SeparatorVisibility=SeparatorVisibility.None,
ItemsSource=项目,
ItemTemplate=新数据模板(()=>
{
标签cityL=新标签()
{
TextColor=Color.Black,
HorizontalTextAlignment=TextAlignment.Start,
FontSize=Device.GetNamedSize(NamedSize.Small,新标签())
};
标签时间=新标签()
{
TextColor=Color.Black,
HorizontalTextAlignment=TextAlignment.Center,
FontSize=Device.GetNamedSize(NamedSize.Small,新标签())
};
cityL.SetBinding(Label.TextProperty,indexer=>indexer.CityName);
标签ll=新标签();
Device.StartTimer(TimeSpan.FromSeconds(1),()=>{
ll.SetBinding(Label.TextProperty,indexer=>indexer.Offset);
双偏移值=Convert.ToDouble(ll.Text);
timeL.Text=DateTime.UtcNow.AddHours(offsetValue).ToString(“hh:mm:ss tt,ddd dd MMM yyyy”);
返回true;
});
返回新的ViewCell
{
视图=新堆栈布局
{
方向=堆叠方向。水平,
孩子们=
{
城市,
时间
}
}
};
})
};
内容=新的堆栈布局
{
儿童={
吕
}
};

我认为您的模板中不应该有StartTimer。例如,在OnAppearing方法中应该有一个StartTimer


当StartTimer事件上升时,您应该更改模型中应有的“时间”属性(将“时间”属性更改为ObservableCollection中的所有项…您不应该使用“列表”)。将此“时间”属性绑定到“timeL”字段。现在,如果您实现INotifyPropertyChanged,您的timeL字段应该会自动更新。

我已经为Alessandro提到的内容添加了代码,这就是应该如何完成的

class OffsetItems : INotifyPropertyChanged
    {
        private double _offset;
        private string _time;
        private string _cityName;

        public string CityName
        {
            get { return _cityName; }
            internal set
            {
                _cityName = value;
                OnPropertyChanged("CityName");
            }
        }

        public string Time
        {
            get { return _time; }
            internal set
            {
                _time = value;
                OnPropertyChanged("Time");
            }
        }

        public double Offset
        {
            get { return _offset; }
            internal set
            {
                _offset = value;
                OnPropertyChanged("Offset");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public partial class MainPage : ContentPage
    {
        ObservableCollection<OffsetItems> Items = new ObservableCollection<OffsetItems>();

        public MainPage()
        {
            InitializeComponent();

            Items.Add(new OffsetItems() { CityName = "Hyderabad", Offset = 5.5 });
            Items.Add(new OffsetItems() { CityName = "London", Offset = 1 });
            Items.Add(new OffsetItems() { CityName = "Tokyo", Offset = 9 });
            Items.Add(new OffsetItems() { CityName = "New York", Offset = -5 });
            Items.Add(new OffsetItems() { CityName = "Dubai", Offset = 4 });

            var lv = new ListView
            {
                ItemsSource = Items,
                SeparatorVisibility = SeparatorVisibility.None,
                ItemTemplate = new DataTemplate(() =>
                {

                    Label cityL = new Label()
                    {
                        TextColor = Color.Black,
                        HorizontalTextAlignment = TextAlignment.Start,
                        FontSize = Device.GetNamedSize(NamedSize.Small, new Label())
                    };
                    Label timeL = new Label()
                    {
                        TextColor = Color.Black,
                        HorizontalTextAlignment = TextAlignment.Center,
                        FontSize = Device.GetNamedSize(NamedSize.Small, new Label())
                    };
                    cityL.SetBinding<OffsetItems>(Label.TextProperty, indexer => indexer.CityName);
                    timeL.SetBinding<OffsetItems>(Label.TextProperty, indexer => indexer.Time, BindingMode.OneWay);

                    Label ll = new Label();

                    return new ViewCell
                    {
                        View = new StackLayout
                        {
                            Orientation = StackOrientation.Horizontal,
                            Children =
                            {
                                cityL,
                                timeL
                            }
                        }
                    };
                })
            };

            Content = new StackLayout
            {
                Children = {
                    lv
                }
            };
        }

        protected override void OnAppearing()
        {
            base.OnAppearing();
            Device.StartTimer(TimeSpan.FromSeconds(1), () =>
            {
                Items.ForEach(row => row.Time = DateTime.UtcNow.AddHours(row.Offset)
                    .ToString("hh:mm:ss tt, ddd dd-MMM-yyyy"));
                return true;
            });
        }
    }
class OffsetItems:INotifyPropertyChanged
{
私人双U补偿;
私有字符串时间;
私有字符串_cityName;
公共字符串城市名称
{
获取{return\u cityName;}
内部集
{
_cityName=值;
OnPropertyChanged(“CityName”);
}
}
公共字符串时间
{
获取{return\u time;}
内部集
{
_时间=价值;
不动产变更(“时间”);
}
}
公共双偏移
{
获取{return\u offset;}
内部集
{
_偏移量=值;
不动产变更(“抵销”);
}
}
公共事件属性更改事件处理程序属性更改;
受保护的虚拟void OnPropertyChanged(字符串propertyName)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
}
}
公共部分类主页:ContentPage
{
ObservableCollection Items=新的ObservableCollection();
公共主页()
{
初始化组件();
添加(新的OffsetItems(){CityName=“Hyderabad”,Offset=5.5});
添加(新的OffsetItems(){CityName=“London”,Offset=1});
添加(新的OffsetItems(){CityName=“Tokyo”,Offset=9});
添加(新的OffsetItems(){CityName=“newyork”,Offset=-5});
添加(新的OffsetItems(){CityName=“Dubai”,Offset=4});
var lv=新列表视图
{
ItemsSource=项目,
SeparatorVisibility=SeparatorVisibility.None,
ItemTemplate=新数据模板(()=>
{
标签cityL=新标签()
{
TextColor=Color.Black,
HorizontalTextAlignment=TextAlignment.Start,
FontSize=Device.GetNamedSize(NamedSize.Small,新标签())
};
标签时间=新标签()
{
TextColor=Color.Black,
HorizontalTextAlignment=TextAlignment.Center,
FontSize=Device.GetNamedSize(NamedSize.Small,新标签())
};
塞宾丁城市酒店
class OffsetItems : INotifyPropertyChanged
    {
        private double _offset;
        private string _time;
        private string _cityName;

        public string CityName
        {
            get { return _cityName; }
            internal set
            {
                _cityName = value;
                OnPropertyChanged("CityName");
            }
        }

        public string Time
        {
            get { return _time; }
            internal set
            {
                _time = value;
                OnPropertyChanged("Time");
            }
        }

        public double Offset
        {
            get { return _offset; }
            internal set
            {
                _offset = value;
                OnPropertyChanged("Offset");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public partial class MainPage : ContentPage
    {
        ObservableCollection<OffsetItems> Items = new ObservableCollection<OffsetItems>();

        public MainPage()
        {
            InitializeComponent();

            Items.Add(new OffsetItems() { CityName = "Hyderabad", Offset = 5.5 });
            Items.Add(new OffsetItems() { CityName = "London", Offset = 1 });
            Items.Add(new OffsetItems() { CityName = "Tokyo", Offset = 9 });
            Items.Add(new OffsetItems() { CityName = "New York", Offset = -5 });
            Items.Add(new OffsetItems() { CityName = "Dubai", Offset = 4 });

            var lv = new ListView
            {
                ItemsSource = Items,
                SeparatorVisibility = SeparatorVisibility.None,
                ItemTemplate = new DataTemplate(() =>
                {

                    Label cityL = new Label()
                    {
                        TextColor = Color.Black,
                        HorizontalTextAlignment = TextAlignment.Start,
                        FontSize = Device.GetNamedSize(NamedSize.Small, new Label())
                    };
                    Label timeL = new Label()
                    {
                        TextColor = Color.Black,
                        HorizontalTextAlignment = TextAlignment.Center,
                        FontSize = Device.GetNamedSize(NamedSize.Small, new Label())
                    };
                    cityL.SetBinding<OffsetItems>(Label.TextProperty, indexer => indexer.CityName);
                    timeL.SetBinding<OffsetItems>(Label.TextProperty, indexer => indexer.Time, BindingMode.OneWay);

                    Label ll = new Label();

                    return new ViewCell
                    {
                        View = new StackLayout
                        {
                            Orientation = StackOrientation.Horizontal,
                            Children =
                            {
                                cityL,
                                timeL
                            }
                        }
                    };
                })
            };

            Content = new StackLayout
            {
                Children = {
                    lv
                }
            };
        }

        protected override void OnAppearing()
        {
            base.OnAppearing();
            Device.StartTimer(TimeSpan.FromSeconds(1), () =>
            {
                Items.ForEach(row => row.Time = DateTime.UtcNow.AddHours(row.Offset)
                    .ToString("hh:mm:ss tt, ddd dd-MMM-yyyy"));
                return true;
            });
        }
    }