逆关系和UI更新不起作用? [英] Inverse Relationships and UI-Update not working?

查看:64
本文介绍了逆关系和UI更新不起作用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在开发Messenger应用程序.因此,我使用领域将数据存储在设备上.我的应用程序包含一个页面,以表示Listview中的所有聊天线程.因此,我将ListView绑定到IRealmCollection.如果我更改了消息线程中的属性,则可以看到Litview正在相应地更新.但是,当我在线程中插入消息时,UI却没有.

I am currently working on a messenger application. Therefore I use realm to store the Data on the device. My app contains a Page to represent all Chatthreads in a Listview. Therefore I binded the ListView to an IRealmCollection. If I change Properties inside the Messagethread I can see that the Litview is updating accordingly. But when I insert a Message into the thread the UI doesn't.

public class Messagethread : RealmObject
{
    [PrimaryKey]
    public string Guid { get; set; }

    public IList<User.User> Users { get;  }

    [Backlink(nameof(Message.Message.MessageThread))]
    public IQueryable<Message.Message> Messages { get; }

    public User.User Owner { get; set; }

    public string Title { get; set; }

    public int CountOfUnreadMessages { get; set; }
    public bool IsPrivate { get; set; }

    public DateTimeOffset LastSyncDate { get; set; }
    public DateTimeOffset LastSingleSyncDate { get; set; }
    public int ItemSyncStatus { get; set; }

    public void CallPropertyChanged(string name)
    {
        base.OnPropertyChanged(name);
    }
}

public class Message : RealmObject
{
    [PrimaryKey]
    public string Guid { get; set; }

    public Messagethread MessageThread { get; set; }
    public User.User Author { get; set; }

    public string Body { get; set; }

    [Backlink(nameof(MessageAttachement.MessageAttachement.Message))]
    public IQueryable<MessageAttachement.MessageAttachement> Attachements { get; }

    public string Title { get; set; }
    public DateTimeOffset SendDate { get; set; }
    public bool SystemMessage { get; set; }
    public DateTimeOffset LocalSyncDate { get; set; }
    public DateTimeOffset ChangeTime { get; set; }

    public bool IsSynced { get; set; }
}

我尝试在插入新消息时在消息"属性上调用PropertyChanged.但这也不起作用.

I've tryed to call PropertyChanged on the Property "Messages" when I insert a new message. But this also didn't work.

如果更改了Backlink属性,是否有一种方法可以实现自动更新UI的行为?

Is there a way to implement a behaviour to automatically update the UI if a Backlink property is changed?

我非常感谢您的帮助 朱利安

I appreciate any help Julian

推荐答案

一个简单的One2Many示例,没有MVVM/Viper/MVC/MVP,也没有XAML使它尽可能简单.

A quick One2Many example, no MVVM/Viper/MVC/MVP and no XAML to keep it as simple as possible.

One to Many导航(MessageThread ->* 消息)

One to Many navigation (MessageThread ->* Message)

public class MessageThread : RealmObject
{
    [PrimaryKey]
    public string Guid { get; set; }

    public IList<Message> Messages { get; }
}

public class Message : RealmObject
{
    [PrimaryKey]
    public string Guid { get; set; }
    public string Body { get; set; }

    [Backlink(nameof(MessageThread.Guid))]
    public MessageThread Thread { get; }
}

简单的主/详细表单用户界面:

public class BackLinkApp : Application
{
    readonly Realm realm;
    readonly IRealmCollection<MessageThread> allMessageThreads;
    readonly Button addMessageThread;
    readonly Button addMessageToThread;
    IRealmCollection<MessageThread> currentMessageThread;
    string currentMessageThreadPriKey;

    public BackLinkApp()
    {
        realm = Realm.GetInstance("backlinks.realm");
        allMessageThreads = (IRealmCollection<MessageThread>)realm.All<MessageThread>();

        var messageCell = new DataTemplate(typeof(TextCell));
        messageCell.SetBinding(TextCell.TextProperty, "Body");
        messageCell.SetBinding(TextCell.DetailProperty, "Guid");
        var messageListView = new ListView
        {
            ItemTemplate = messageCell,
        };
        var threadCell = new DataTemplate(typeof(TextCell));
        threadCell.SetBinding(TextCell.TextProperty, "Guid");
        var messageThreadListView = new ListView
        {
            ItemsSource = allMessageThreads,
            ItemTemplate = threadCell
        };

        messageThreadListView.ItemSelected += (sender, e) =>
        {
            currentMessageThreadPriKey = (messageThreadListView.SelectedItem as MessageThread).Guid;
            currentMessageThread = (IRealmCollection<MessageThread>)realm.All<MessageThread>().Where((messageThread) => messageThread.Guid == currentMessageThreadPriKey);
            messageListView.ItemsSource = currentMessageThread?.FirstOrDefault()?.Messages;
            addMessageToThread.IsEnabled = currentMessageThread?.Count() > 0;
        };

        addMessageThread = new Button { Text = "Add New MessageThread" };
        addMessageThread.Clicked += (sender, e) =>
        {
            realm.Write(() =>
            {
                var messageThread = new MessageThread { Guid = Guid.NewGuid().ToString() };
                realm.Add(messageThread);
            });
        };

        addMessageToThread = new Button { Text = "Add New Message to Thread", IsEnabled = false };
        addMessageToThread.Clicked += (sender, e) =>
        {
            realm.Write(() =>
            {
                currentMessageThread = (IRealmCollection<MessageThread>)realm.All<MessageThread>().Where((messageThread) => messageThread.Guid == currentMessageThreadPriKey);
                var counter = currentMessageThread.FirstOrDefault().Messages.Count() + 1;
                var message = new Message { Guid = Guid.NewGuid().ToString(), Body = $"StackoverFlow:{counter}" };
                currentMessageThread?.FirstOrDefault()?.Messages.Add(message);
            });
        };

        MainPage = new ContentPage
        {
            Content = new StackLayout
            {
                VerticalOptions = LayoutOptions.Center,
                Children = {
                    addMessageThread, messageThreadListView, addMessageToThread, messageListView
                }
            }
        };
    }
}

通过将messageListView.ItemsSource的绑定源设置为当前 所选MessageThread对象的Messages属性,当向该线程添加新消息时,您的UI将自动"更新:

By setting the binding source of messageListView.ItemsSource to the Messages property of the currently selected MessageThread object, your UI will "auto" update when a new message is added to that thread:

messageListView.ItemsSource = currentMessageThread?.FirstOrDefault()?.Messages;

这篇关于逆关系和UI更新不起作用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆