Uwp 反应UI-如何共享属性?

Uwp 反应UI-如何共享属性?,uwp,reactiveui,rx.net,Uwp,Reactiveui,Rx.net,我遇到一个问题,在两个派生的ViewModel之间共享一个属性: public abstract class MyBaseViewModel : ViewModelBase { private string _sharedProperty; public string SharedProperty { get => _sharedProperty; set => this.RaiseAndSetIfChanged(ref _sh

我遇到一个问题,在两个派生的ViewModel之间共享一个属性:

public abstract class MyBaseViewModel : ViewModelBase
{
    private string _sharedProperty;
    public string SharedProperty
    {
        get => _sharedProperty;
        set => this.RaiseAndSetIfChanged(ref _sharedProperty, value);
    }
}

public abstract class ViewModelA : MyBaseViewModel
{

}

public abstract class ViewModelB : MyBaseViewModel
{

}

public sealed partial class FirstPage : IViewFor<ViewModelA>
{
    this.Bind(ViewModel,
        vm => vm.SharedProperty,
        view => view.MycontrolA.Text)
    .DisposeWith(disposable);
}

public sealed partial class SecondPage : IViewFor<ViewModelB>
{
    this.Bind(ViewModel,
        vm => vm.SharedProperty,
        view => view.MycontrolB.Text)
    .DisposeWith(disposable);
}
公共抽象类MyBaseViewModel:ViewModelBase { 私有字符串\u共享属性; 公共字符串共享属性 { get=>\u共享属性; set=>this.RaiseAndSetIfChanged(ref\u sharedProperty,value); } } 公共抽象类ViewModelA:MyBaseViewModel { } 公共抽象类ViewModelB:MyBaseViewModel { } 公共密封部分类首页:IViewFor { 这个.Bind(ViewModel, vm=>vm.SharedProperty, view=>view.MycontrolA.Text) .处置(一次性); } 公共密封部分类第二页:IViewFor { 这个.Bind(ViewModel, vm=>vm.SharedProperty, view=>view.MycontrolB.Text) .处置(一次性); }
当我从SecondPage更新SharedProperty时,FirstPage上的绑定不会更新。现在很明显,每个ViewModel都有自己的属性实例,因为它不是静态的。既然RaiseAndSetIfChanged需要执行一个实例,那么我们如何拥有一个在两个不同视图中绑定并共享其绑定的属性???

考虑使用DependencyInjection和某种注册常量值来存储两个对象之间的注册。然后使用ObservablesPropertyHelper使您的属性保持最新

在Splat DI中注册您的

    private static void RegisterDynamic(IMutableDependencyResolver resolver)
    {
         resolver.RegisterConstant<IMyDataType>(new MyDataType());
    }
private static void RegisterDynamic(IMutableDependencyResolver解析程序)
{
resolver.RegisterConstant(新的MyDataType());
}
然后在ViewModels构造函数中可以执行以下操作

public class ViewModelA : IDisposable
{    
    private readonly ObservableAsPropertyHelper<string> sharedProperty;
    private readonly IMyDataType dataType;

    public ViewModelA(IMyDataType dataType = null)
    {
        this.dataType = dataType ?? Locator.Current.GetService<IMyDataType>();
        this.sharedProperty = dataType.WhenAnyValue(x => x.SharedProperty).ToProperty(this, x => x.SharedProperty);
    }

    public string SharedProperty => this.sharedProperty.Value;

    public void Dispose() => this.sharedProperty?.Dispose();
}
公共类ViewModelA:IDisposable
{    
私有只读可观察属性Helper sharedProperty;
私有只读IMyDataType数据类型;
公共视图模型A(IMyDataType dataType=null)
{
this.dataType=dataType??Locator.Current.GetService();
this.sharedProperty=dataType.WhenAnyValue(x=>x.sharedProperty).ToProperty(this,x=>x.sharedProperty);
}
公共字符串SharedProperty=>this.SharedProperty.Value;
public void Dispose()=>this.sharedProperty?.Dispose();
}
然后可以对ViewModelB重复相同的过程


您需要考虑的另一个考虑因素是,您可能希望处理对ToFrimeType()的订阅。在上面的示例中,我刚刚完成了一个简单的Dispose,还有一些机制可以用于WhenActivate。请考虑使用DependencyInjection和某种注册常量值来存储两个对象之间的注册。然后使用ObservablesPropertyHelper使您的属性保持最新

在Splat DI中注册您的

    private static void RegisterDynamic(IMutableDependencyResolver resolver)
    {
         resolver.RegisterConstant<IMyDataType>(new MyDataType());
    }
private static void RegisterDynamic(IMutableDependencyResolver解析程序)
{
resolver.RegisterConstant(新的MyDataType());
}
然后在ViewModels构造函数中可以执行以下操作

public class ViewModelA : IDisposable
{    
    private readonly ObservableAsPropertyHelper<string> sharedProperty;
    private readonly IMyDataType dataType;

    public ViewModelA(IMyDataType dataType = null)
    {
        this.dataType = dataType ?? Locator.Current.GetService<IMyDataType>();
        this.sharedProperty = dataType.WhenAnyValue(x => x.SharedProperty).ToProperty(this, x => x.SharedProperty);
    }

    public string SharedProperty => this.sharedProperty.Value;

    public void Dispose() => this.sharedProperty?.Dispose();
}
公共类ViewModelA:IDisposable
{    
私有只读可观察属性Helper sharedProperty;
私有只读IMyDataType数据类型;
公共视图模型A(IMyDataType dataType=null)
{
this.dataType=dataType??Locator.Current.GetService();
this.sharedProperty=dataType.WhenAnyValue(x=>x.sharedProperty).ToProperty(this,x=>x.sharedProperty);
}
公共字符串SharedProperty=>this.SharedProperty.Value;
public void Dispose()=>this.sharedProperty?.Dispose();
}
然后可以对ViewModelB重复相同的过程


您需要考虑的另一个考虑因素是,您可能希望处理对ToFrimeType()的订阅。在上面的示例中,我刚刚完成了一个简单的Dispose,还有一些机制可以用于何时使用Activate。

我之所以使用nullable类型来传递数据类型,是为了在您希望使用不同的数据存储运行单元测试时更容易测试。回答得很好!我从来没有想过在这种意义上使用Splat。谢谢。我之所以使用可空类型来传递数据类型,是因为如果您想使用不同的数据存储运行单元测试,那么测试更容易。回答得很好!我从来没有想过在这种意义上使用Splat。谢谢