我正在使用带有Unity容器的PRISM。
假设我有3个模块,模块A,模块B和用户模块。 UserModule跟踪当前用户及其权限,模块A具有包含包含所有可用用户的ComboBox的View / VM,而模块B具有仅显示当前所选用户名称的View / VM。 / p>
UserModule注册UserService的单例实例,用于管理用户并提供更改当前用户的方法。
UserModule.cs
/// Create and register instance of laser service
this.container.RegisterType<IUserService,UserService>(new ContainerControlledLifetimeManager());
模块A - HeaderViewModel.cs
public class HeaderViewModel : BindableBase
{
private readonly IUserService _userService;
private List<IUser> users;
private IUser curUser;
public HeaderViewModel(IUserService userService)
{
_userService = userService;
users = _userService.GetUsers();
curUser = _userService.CurUser;
}
public List<IUser> Users
{
get { return users; }
}
public IUser CurUser
{
get { return curUser; }
set
{
SetProperty<IUser>(ref curUser, value);
_userService.CurUser=curUser;
}
}
}
模块A - HeaderView.xaml
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
<TextBlock Text="{Binding CurUser.Name, Mode=TwoWay}"></TextBlock>
<TextBlock Text="Users: "></TextBlock>
<ComboBox ItemsSource="{Binding Users, Mode=TwoWay}" SelectedItem="{Binding CurUser, Mode=TwoWay}" ></ComboBox>
</StackPanel>
以上所有工作正常,HeaderView.xaml
加载了ComboBox,当我更改用户时,它会更新显示当前用户名的TextBlock,以及更新当前用户对象在UserService单例中。
现在,如果我从模块B中有另一个显示当前用户名的View/VM
,它也应该自动更新。但是,我还没有能够成功地使这种绑定工作。
如果需要,我可以发布更多代码,但我真正的问题是这种方法是否可行?如果每个用户都具有某些特权,并且某些控件基于这些特权建立了IsEnabled属性,那么简单地更新单例UserService对象中的当前用户并通过简单绑定,跨不同模型的所有其他views/vms
将是非常棒的自动更新。这可能吗?或者我是否需要添加某种&#34;用户已更改&#34;事件并将其发布到需要更新其UI的所有视图模型?
由于
修改1 由于被动的人似乎无法理解我所要求的内容,我会澄清。如果2个单独的视图都使用相同的单例服务来获取数据,那么当View1修改此数据时,View2是否可以通过xaml绑定进行原子更新?例如,想象一下,您有2个单独的视图,允许您通过ComboBox更改当前用户。当我在View1上更改用户时,View2是否可以通过适当的绑定自动更新它的所选用户?
答案 0 :(得分:0)
您可以通过让您的服务通知应用程序的其余部分更改数据来实现这一目标。
一种可能性是制作服务实现INotifyPropertyChanged
,然后让每个视图模型使用the property observer在收到服务通知时为其自己的属性发布适当的通知。
根据应用程序的大小,您可能需要推出一些专用的CQRS system,但对于我的桌面应用程序,PropertyObserver
通常做得非常好,并提供易于理解和重构的代码。
答案 1 :(得分:-1)
只需将绑定上的模式设置为双向。