我遇到了一个问题,两个派生ViewModels之间共享了一个属性:
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);
}
当我从SecondPage更新SharedProperty时,FirstPage态。由于RaiseAndSetIfChanged需要一个实例来执行,我们如何将一个属性绑定在两个不同的视图中并共享其绑定??
考虑使用DependencyInjection和某种注册的常数值来存储两个对象之间的注册。然后使用ObservableAsPropertyHelper使您的属性保持最新。
在您的Splat DI 中注册您的
private static void RegisterDynamic(IMutableDependencyResolver resolver)
{
resolver.RegisterConstant<IMyDataType>(new 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();
}
然后可以对ViewModelB重复相同的过程。
您需要考虑的另一个因素是,您可能想要处理ToProperty((的Subscription。在上面的例子中,我刚刚做了一个简单的Dispose,还有一些WhenActivate的机制可以使用。