c# - datos - realm pricing
¿Las relaciones inversas y la actualización de la interfaz de usuario no funcionan? (1)
Un rápido ejemplo de One2Many, sin MVVM / Viper / MVC / MVP y sin XAML para mantenerlo lo más simple posible.
Modelo de datos (versión simplificada de los suyos):
Navegación de One to Many
(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; }
}
Interfaz de usuario Simple Simple / Detail Forms:
Ejemplo de aplicación de Xamarin.Forms
:
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
}
}
};
}
}
Al establecer el origen de messageListView.ItemsSource
de messageListView.ItemsSource
a la propiedad Messages
del objeto MessageThread
seleccionado actualmente , su UI se actualizará "automáticamente" cuando se agregue un nuevo mensaje a ese hilo:
messageListView.ItemsSource = currentMessageThread?.FirstOrDefault()?.Messages;
Actualmente estoy trabajando en una aplicación de mensajería. Por lo tanto, uso el reino para almacenar los Datos en el dispositivo. Mi aplicación contiene una página para representar todos los Chatthreads en una vista de lista. Por lo tanto, ligé el ListView a un IRealmCollection. Si cambio las Propiedades dentro del Messagethread, puedo ver que el Litview se está actualizando en consecuencia. Pero cuando inserto un mensaje en el hilo, la interfaz de usuario no lo hace.
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; }
}
Intenté llamar a PropertyChanged en la propiedad "Mensajes" cuando inserto un nuevo mensaje. Pero esto tampoco funcionó.
¿Hay alguna forma de implementar un comportamiento para actualizar automáticamente la UI si se cambia una propiedad de Backlink?
Agradezco cualquier ayuda Julian