用于测试和学习的我创建了一个Xamarin.forms应用程序,该应用程序包含一个绑定到SQLITE数据库的listView。XAML是这样的:
<ListView>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout>
<Label Text="{Binding name}" />
<Switch IsToggled="{Binding switchState}" />
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
CodeBehind将ListView.itemssource绑定到Database.getItemSasync((的项目列表。
模型很简单:
public class Item
{
[PrimaryKey, AutoIncrement]
public int id { get; set; }
public string name { get; set; }
public bool switchState { get; set; }
}
我想每次用户更改交换机时将时间戳记录到其他表。我该如何连接到绑定以实现这一目标?
陷阱1:SwitchState列也可以由业务逻辑的其他部分写入。但是在这种情况下,我不希望这些更改记录。这就是为什么我不能在模型中使用简单的设置例程,因为这始终会记录。
陷阱2:通过数据库绑定对基础数据库的任何更改也确实传播到视图,对吗?像在#1中一样,视图中出现的变化是不需要记录的基础数据库的更改。
我该如何完成?
交换机具有Toggled
事件,因此在您的CodeBehind中您可以创建这样的方法:
private void HandleSwitchToggled(object sender, ToggledEventArgs e)
{
// log the timestamp to your database
}
然后在您的XAML中,
<Switch IsToggled="{Binding switchState}"
Toggled="HandleSwitchToggled" />
为了更新数据库和视图更新,视图不绑定到数据库,而是绑定到从数据库调用返回的List<Item>
。因此,如果要更新视图,则需要直接更新List<Item>
(并且在必要时也更新数据库,尽管更新数据库不会影响视图(。
在旁注上,您不应将ListView
绑定到代码范围内的List<item>
;您应该在视图模型中这样做。