静态属性/ ViewModel (c#, WinRT)

本文关键字:WinRT 属性 ViewModel 静态 | 更新日期: 2023-09-27 18:11:24

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

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

我认为有可能创建一个类似全局UserAccountViewModel的东西,这将是一个具有所需属性的经典视图模型,并且将从静态UserAccount类手动更新,但这似乎不是一个最好的解决方案。

你能想到一个更好的方法来实现这一点,同时满足上述两个条件吗?

任何帮助都非常感谢。

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

静态属性/ ViewModel (c#, WinRT)

创建一个所有其他ViewModel继承的Base ViewModel。您现在不必将其设置为静态以供所有访问,因为每个ViewModel都已经可以访问它。在Binding中,您不指定base。地产

一个抽象视图模型,包含属性填充该数据的功能。

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 { }

你可以直接绑定到中的父属性OtherView.xaml:

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

BusinessLogic类具有静态GetUsername()方法,用于检索用户名。为了不重复工作负载,只检索一次,但提供多个。所以你会将它静态地存储在你的业务逻辑中,直到一个Refresh概念被调用。

或者,你可以有一个ViewModel收集你想要的数据,然后用户EventAggregator或任何你想要传递给所有其他需要它的ViewModel。这将消除静态业务逻辑的想法。使用Prism的EventAggregator非常棒,ViewModels订阅和一个(或多个)发布事件,并包含与之相关的对象/数据。这些其他ViewModels可以立即订阅和接收,或者你可以做双向通信让ViewModels 'Request'然后获得'Response'。不确定您是否可以利用它,或者必须自己滚动,但这个概念是有效的,至少可以通过传递UserInfo对象的事件来完成。