Uwp 反应UI-如何共享属性?
我遇到一个问题,在两个派生的ViewModel之间共享一个属性: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
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。谢谢