在ViewModels之间传递Realm事务

时间:2017-08-10 17:42:36

标签: c# uwp realm template10

注意:这与Passing Realm objects between ViewControllers

不同

我正试图找到一种方法在两个Transaction之间传递一个领域ViewModel。目前,Transaction在详细视图中打开,因此我只能在详细视图中访问它。我需要在主视图中Dispose,所以我想我可以在导航到详细视图之前开始Transaction,如下所示:

var trans = realm.BeginWrite();
NavigationService.Navigate(typeof(DetailPage), trans);

但是,领域Transaction不可序列化,因此此方法不起作用。我在UWP应用程序中使用Template10。在Xamarin应用程序(QuickJournal示例)中,可以这样完成:

var transaction = realm.BeginWrite();
...
var page = new JournalEntryDetailsPage(new JournalEntryDetailsViewModel(entry, transaction));
Navigation.PushAsync(page);

据我所知,没有办法使用Template10的NavigationService将参数传递给构造函数。我很高兴能够:a)将Transaction从主视图传递到构造函数中的详细视图,或者b)以某种方式从主视图访问详细视图的Transaction。 / p>

我目前的解决方法是根本不使用Transaction,而是在详细信息视图中创建RealmObject的非托管副本,但这似乎不是一个很好的永久解决方案。< / p>

1 个答案:

答案 0 :(得分:1)

你可以实现一个穷人的注射缓存来解决序列化限制:

public static class Injector
{
    private static readonly ConcurrentDictionary<Guid, object> _dict = new ConcurrentDictionary<Guid, object>();

    public static Guid Store(object value)
    {
        var key = Guid.NewGuid();
        _dict.TryAdd(key, value);
        return key;
    }

    public static object Retrieve(Guid guid)
    {
        if (!_dict.TryRemove(guid, out var result))
        {
            throw new Exception("Key not found");
        }
        return result;
    }
}

然后在你的主ViewModel中你可以这样做:

var key = Injector.Store(realm.BeginWrite());
NavigationService.Navigate(typeof(DetailPage), key);

然后在您的详细ViewModel中,您可以检索交易:

_transaction = Injector.Retrieve(key);