我是否应该绑定到 WPF Prism 中的 SharedService 属性



我使用SharedService(Prism(在两个模块之间获取数据。在共享服务中,我放置了一个名为 AdapterName 的字符串属性。 假设模块 A 中有 ViewAViewModel,模块 B 有 ViewBViewModel

public class ViewAViewModel : BindableBase {
private string _adapterNameA;
public string AdapterNameA
{
get { return _adapterNameA; }
set { SetValue (ref _adapterNameA, value); }
}
private ISharedService _sharedService;
public ISharedService SharedService {
get { return _sharedService; }
set { SetValue (ref _sharedService, value); }
}
public ViewAViewModel (ISharedService sharedService) {
_sharedService = sharedService;
}
}
public class ViewBViewModel : BindableBase {
private string _adapterNameB;
public string AdapterNameB {
get { return _adapterNameB; }
set { SetValue (ref _adapterNameB, value); }
}
private ISharedService _sharedService;
public ISharedService SharedService {
get { return _sharedService; }
set { SetValue (ref _sharedService, value); }
}
public ViewBViewModel (ISharedService sharedService) {
_sharedService = sharedService;
}
}
public interface ISharedService {
string AdapterName { get; set; }
}
public class SharedService : BindableBase, ISharedService {
private string _adapterName;
public string AdapterName {
get { return _adapterName; }
set { SetValue (ref _adapterName, value); }
}
}

我有一个同时具有视图 A 和视图 B 的文本框,我希望视图 A 中的文本框中的值始终与视图 B 中的值相同。那么我应该更改 AdapterNameA get 中的 SharedService.AdapterName 值(类似于 AdapterNameB(?

public string AdapterNameA
{
get { 
_adapterNameA = SharedService.AdapterName;
return _adapterNameA;
}
set { 
SetValue (ref _adapterNameA, value); 
SharedService.AdapterName = value;
}
}

或直接绑定到共享服务属性

Text = "{Binding Path=SharedService.AdapterName, UpdateSourceTrigger=PropertyChanged}"

还是其他方式?(我正在尝试使用Prism制作WPF MVVM(

如果共享服务实现INotifyPropertyChanged事件并引发更改通知,则可以直接绑定到其属性,前提是您确实希望通过视图模型的属性公开服务。您可能不希望根据服务的功能执行此操作。

如果不想公开服务,则需要在视图模型中创建包装器属性。这提供了更好的封装,但代价是包装器属性(如果您有多个(的一些额外代码行。

但这里没有真正的对错。在此特定情况下,您必须确定哪种解决方案对您最有意义。

通常,服务应该抽象出来并负责从某个地方获取一些结果,并将这些结果传递回视图模型。它通常不实现INotifyPropertyChanged事件并公开视图直接绑定到的属性。定义和公开此属性是视图模型的责任。视图模型可能仍使用该服务来填充属性。

最新更新