2013-04-29 77 views
2

我在我的WinRT项目中有一个静态的UserAccount类。该类包含有关当前登录用户的各种静态属性(如用户名,电子邮件地址,...)。我需要这个信息可以从任何视图使用绑定(例如 - 我想显示个性化的消息"Welcome, {0}" - 传递用户名 - 在应用程序的一页),但我需要确保,这些条件得到满足:静态属性/ ViewModel(C#,WinRT)

  1. 以正确MVVM图案方式实现它
  2. 当用户切换到当应用程序正在运行通设置魅力另一个帐户,结合的字段(如消息等等)应该自动与新更新数据。

我认为这将有可能像全球UserAccountViewModel创造的东西,这将是具有所需性能的经典视图模型,并会从静态UserAccount类进行手动更新,但不似乎是最好的解决方案。

你能否想到一个更好的方法来实现这一目标并满足上述两个条件?

任何帮助极大的赞赏。

编辑: 类似的情况又一个类别中发生,我需要 - NetworkStatus - 其中有IsInternetAvailable知道应用是否被连接,但我需要使用这个布尔绑定到不同的按钮的IsEnabled属性中的应用。

+1

是否可用于Windows RT XAML {x:Static namespace:Class.Property}?如果没有一种方法可以使用依赖注入容器并将您的用户帐户信息注册为单个实例类型。因此,您的ViewModel可以将UserAccount注入到构造函数中。你在使用DI吗? – Alan 2013-04-29 14:38:34

+0

我认为x:Static不可用。我想到了DI方法,但是这使得从代码隐藏(例如 - 其中一个属性是AccessToken,我用它从Web服务加载数据)导致了对UserAccount类属性的一些不友好的访问 - 现在我将不得不做一些像ViewModelLocator.UserAccount.AccessToken(本质上更麻烦的代码))还是有另一种方法来实现这一点? – 2013-04-29 17:52:17

+1

为什么你需要从后面的代码访问视图模型属性?这是属于视图模型的内容。 – 2013-04-30 04:19:55

回答

2

s创建一个基本ViewModel,所有其他ViewModel继承自。您无需将其设为静态即可进行全部访问,因为每个ViewModel都可以访问它。在绑定中,您不指定base.Property要么。

包含属性的抽象视图模型填充此数据的功能。

public abstract class UserAccountViewModel : ObservableObject, IViewModel 
{ 
    //use private member and do a RaisePropertyChanged("Username") 
    public string Username { get; set; } 

    private void GetUserInformation() 
    { 
     Username = BusinessLogic.GetUsername(); 
    } 
} 

现在你让你的ViewModels继承它

public class OtherViewModel : UserAccountViewModel { } 

而且你可以直接在绑定到parent属性OtherView.xaml:

<TextBlock Text="{Binding Path=Username, Mode=OneWay}" /> 

BusinessLogic类有静态GetUsername( )方法检索用户名。为了不重复工作量,只检索一次,但提供很多。所以你会将它静态存储在你的businesslogic中,直到它所调用的Refresh概念。

或者,你可以有一个视图模型所采集你需要的数据,那么无论你想通过周围这需要所有其他的ViewModels用户EventAggregator或。这将消除静态的businesslogic想法。使用Prism的EventAggregator非常好,ViewModels订阅和一个(或多个)发布事件,并包含对象/数据。因此,这些其他ViewModel可以立即订阅和接收,或者您可以进行双向通信并获得ViewModel的“请求”,然后获得“响应”。不知道你是否可以利用它,或者必须推出自己的,但是这个概念是有效的,并且可以通过至少传递一个UserInfo对象的事件来完成。

+0

对不起,花了我很长时间来标记你的答案,我不小心忘了这么做;-)。 – 2014-01-11 12:40:04