【发布时间】:2016-11-12 23:40:20
【问题描述】:
我正在为 Android 开发一个 Xamarin 应用程序,使用 Xamarin 表单来创建我的布局。我遇到了一个问题,我的时间选择器在加载我的视图单元时触发。
我正在做的是创建一个列表视图,然后将项目模板设置为我的自定义视图单元格模板。在我的视图单元格模板中,我正在创建一个 TimePicker 并将 PropertyChanged 事件绑定到它。我还使用从数据库中检索到的信息设置 TimePicker.Time 属性。此时似乎发生的是,我的 PropertyChanged 事件为将显示在列表视图中的每个项目触发。这会导致不需要的多个数据库调用。
有没有办法阻止 PropertyChanged 事件被调用,直到一个属性实际被更改?
我的代码如下。
public class MyCell : ViewCell
{
private readonly TimePicker _myTimePicker;
public MyCell()
{
_myTimePicker = new TimePicker()
{
HorizontalOptions = LayoutOptions.EndAndExpand
};
_myTimePicker.SetBinding(TimePicker.TimeProperty, "StartTime");
_myTimePicker.PropertyChanged += MyTimePicker_PropertyChanged;
var viewLayout = new StackLayout()
{
HorizontalOptions = LayoutOptions.StartAndExpand,
Orientation = StackOrientation.Horizontal,
Padding = new Thickness(20),
Children = { _myTimePicker }
};
View = viewLayout;
}
private void MyTimePicker_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName == TimePicker.TimeProperty.PropertyName && _myTimePicker.Time != TimeSpan.MinValue)
{
var dataAccess = new DataAccessLayer();
dataAccess.Update(myTimePicker.Time);
}
}
}
我不确定为什么 propertychanged 事件会被多次触发,以及如何在我实际选择时间之前阻止它触发。任何帮助将不胜感激。
下面是我用于显示列表视图的表单代码。我所有的 xaml 都是在代码中定义的。 “MyCell”使用从“_dataAccess.GetTimes()”返回的值。
public class TimeDetails : ContentPage
{
private ListView _listView;
private readonly DataAccessLayer _dataAccess = new DataAccessLayer();
protected override void OnAppearing()
{
_listView = new ListView
{
RowHeight = 80,
SeparatorColor = Color.Blue,
SeparatorVisibility = SeparatorVisibility.Default
};
_listView.ItemsSource = _dataAccess.GetTimes();
_listView.ItemTemplate = new DataTemplate(typeof(MyCell));
_listView.ItemSelected += ListView_ItemSelected;
Content = new StackLayout
{
VerticalOptions = LayoutOptions.FillAndExpand,
Children = { _listView }
};
}
}
_dataAcess.GetTimes() 的返回类型是TaskTime 列表。 TaskTime 模型如下所示。
public class TaskTime
{
public int Id { get; set; }
public string Task { get; set; }
public TimeSpan StartTime { get; set; }
}
【问题讨论】:
-
我假设您发布的这段代码在您的页面中?您还可以发布您的 xaml 和代码如何绑定到 listview 吗?特别是您分配 ItemSource 和 ItemBindingTemplate 的位置。目前尚不清楚您是在 xaml 中还是在代码中的某个地方执行此操作。然后我可以尝试重现
-
我最初发布的代码在我的自定义单元格中,该单元格在我的列表视图项模板中使用。我已使用您要求的信息对原始问题进行了编辑。谢谢。
-
MyCell 是从什么东西派生的吗?我看到 View = viewLayout;但 MyCell 中没有视图。还有什么 _dataAccess.GetTimes();回报? listView 中没有定义绑定。你能把整个源代码放在某个地方,以便我更快地帮助你吗?
-
更新是上面提出的问题。我不知道我可以把代码放在哪里让你看看。
-
Dropbox 或 github
标签: android xamarin xamarin.forms timepicker propertychanged