【问题标题】:Xamarin.Forms log changes to bound dataXamarin.Forms 记录对绑定数据的更改
【发布时间】:2018-08-07 19:10:14
【问题描述】:

为了测试和学习,我创建了一个 Xamarin.forms 应用程序,其中包含一个绑定到 SQlite 数据库的列表视图。 xml是这样的:

        <ListView>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout>
                            <Label Text="{Binding name}" />
                            <Switch IsToggled="{Binding switchState}" />
                         </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

代码隐藏将 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 一样,不会记录由于底层数据库更改而出现在视图中的更改。

我该如何做到这一点?

【问题讨论】:

    标签: data-binding xamarin.forms event-handling


    【解决方案1】:

    开关有一个Toggled 事件,所以在你的代码隐藏中你可以创建一个这样的方法:

    private void HandleSwitchToggled(object sender, ToggledEventArgs e)
    {
        // log the timestamp to your database
    }
    

    然后在您的 xaml 中,

    <Switch IsToggled="{Binding switchState}"
            Toggled="HandleSwitchToggled" />
    

    至于更新数据库和更新视图,视图没有绑定到数据库,而是绑定到从数据库调用返回的List&lt;Item&gt;。因此,如果要更新视图,则需要直接更新List&lt;Item&gt;(如果需要,还要更新数据库,但再次更新数据库不会影响视图)。

    附带说明,您不应在代码隐藏中将ListView 绑定到List&lt;item&gt;;你应该在视图模型中这样做。

    【讨论】:

    • 感谢提示,它立即起作用。关于你的评论......你绝对是对的,对于真正的 MVVM,我应该这样做,但坦率地说,我很难实现 MVVM。知道它是如何工作的并不足以获得工作代码,而且男孩,这整个 MVVM 事情都被过度设计和过度复杂化(对我目前的水平而言),同时也被记录不足,所以目前我'将按原样使用我的应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    相关资源
    最近更新 更多