逆关系和UI更新不起作用? [英] Inverse Relationships and UI-Update not working?
问题描述
我目前正在开发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屋!