C# 使用MVVM Light绑定到Windows Phone 8.1中的伪静态数据 期望结果 大多数xaml页面顶部的状态栏,其颜色和文本根据布尔变量的值而变化。 页面背景也设置为基于此布尔值的颜色。 本质上,这些表示应用程序是否连接到服务器;我们不需要在这里讨论连接性逻辑,除了一种反转联机布尔值的方法,以便模拟不断变化的连接性状态并测试绑定。 我希望这些更新在每个视图模型中都没有重复的逻辑。 当前实施

C# 使用MVVM Light绑定到Windows Phone 8.1中的伪静态数据 期望结果 大多数xaml页面顶部的状态栏,其颜色和文本根据布尔变量的值而变化。 页面背景也设置为基于此布尔值的颜色。 本质上,这些表示应用程序是否连接到服务器;我们不需要在这里讨论连接性逻辑,除了一种反转联机布尔值的方法,以便模拟不断变化的连接性状态并测试绑定。 我希望这些更新在每个视图模型中都没有重复的逻辑。 当前实施,c#,xaml,data-binding,windows-phone-8.1,mvvm-light,C#,Xaml,Data Binding,Windows Phone 8.1,Mvvm Light,为了尽量减少代码量,我将尝试将项目减少为四个文件,并且只关注文本属性,如果我们可以处理文本,我们也可以处理颜色。希望我们可以假设我的ViewModelLocator.cs、App.xaml、Generic.xaml和支持的ConnectionityStatusBar.cs已经正确实现,如果需要,我也可以共享这些 HomePage.xaml:使用连接状态栏的示例视图。 SessionData.cs:在找到连通性布尔值的地方,我尝试将类设置为单例。 使用Client.ViewModel; 使用Gal

为了尽量减少代码量,我将尝试将项目减少为四个文件,并且只关注文本属性,如果我们可以处理文本,我们也可以处理颜色。希望我们可以假设我的ViewModelLocator.cs、App.xaml、Generic.xaml和支持的ConnectionityStatusBar.cs已经正确实现,如果需要,我也可以共享这些

HomePage.xaml:使用连接状态栏的示例视图。 SessionData.cs:在找到连通性布尔值的地方,我尝试将类设置为单例。 使用Client.ViewModel; 使用GalaSoft.MvvmLight; 命名空间客户端 { 公共密封类SessionData:ViewModelBase { 私有静态只读SessionData实例=新SessionData; 私人网上书店; 公共静态SessionData getInstance { 获取{return Instance;} } 公共图书馆在线 { 获取{return\u online;} 设置 { _在线=价值; RaisePropertyChanged=>Online; RaisePropertyChanged=>ConnectivityStatusBarViewModel.getInstance.Text; } } } } ConnectivityStatusBarViewModel.cs:决定状态栏颜色和文本的逻辑。我在这里尝试过类似的单例逻辑。 使用制度; 使用GalaSoft.MvvmLight; 名称空间Client.ViewModel { 公共密封类ConnectivityStatusBarViewModel:ViewModelBase { 私有静态只读ConnectivityStatusBarViewModel实例=新的ConnectivityStatusBarViewModel; 公共静态连接状态BarViewModel getInstance { 获取{return Instance;} } 公共字符串文本 { 获取{return SessionData.getInstance.Online?Online:Offline;} } } } HomePageViewModel.cs:在其中可以找到布尔反转方法。 使用GalaSoft.MvvmLight; 使用GalaSoft.MvvmLight.Command; 名称空间Client.ViewModel { 公共类HomePageViewModel:ViewModelBase { 公共主页视图模型 { InverseConnectionyCommand=新的RelayCommandInvertConnection; } public RelayCommand InvertConnectivityCommand{get;set;} 私有连接 { SessionData.getInstance.Online=!SessionData.getInstance.Online; } } } 这个代码没有给我想要的结果;按下HomePage.xaml上的按钮时,文本不会更改。如果我将反转方法放入ConnectivityStatusBarViewModel.cs中,它确实可以工作

有可能做到这一点,还是我在浪费时间?如果可能的话,我如何改变我的方法以使其有效

编辑:ViewModelLocator.cs看起来像:

使用GalaSoft.MvvmLight.Ioc; 使用Microsoft.Practices.ServiceLocation; 名称空间Client.ViewModel { 公共类ViewModelLocator { 静态ViewModelLocator { ServiceLocator.SetLocatorProvider=>SimpleIoc.Default; SimpleIoc.Default.Register; SimpleIoc.Default.Register; } 公共连接状态栏视图模型连接状态栏 { 获取{return ServiceLocator.Current.GetInstance;} } 公共主页视图模型主页 { 获取{return ServiceLocator.Current.GetInstance;} } } }
您可以尝试向ViewModelLocator提供确切的实例,而不是在ViewModelLocator中注册新的ConnectivityStatusBarViewModel实例

SimpleIoc.Default.Register(() => ConnectivityStatusBarViewModel.getInstance);
这样,当调用获取实例的调用时:

return ServiceLocator.Current.GetInstance<ConnectivityStatusBarViewModel>();
实际上,您绑定到了另一个实例,这就是为什么数据没有在UI中刷新


顺便说一句,此代码/您的代码存在一些设计问题/冗余,但这超出了问题的范围-我正在尝试对其进行最小的更改以使其正常工作。

这意味着什么?是否未调用该命令?在输出窗口中是否有任何绑定错误?如果我调试InvertConnectivity,我可以看到它已被调用。如果我输出联机布尔值和文本字符串,它们都会更改,但是屏幕上的实际文本不会更改。您是否尝试绑定到ConnectivityStatusBarViewModel.getInstance.Text?还是康涅狄格州
ectivityStatusBar已在VMLocator中返回ConnectionVityStatusBar.getInstance?我不确定如何执行此操作,如果有帮助,我已包含VMLocator代码。我明白您在此处的意思,并且我理解为什么这样做会起作用,但是更改ViewModelLocator并没有解决此问题。
Text="{Binding ConnectivityStatusBar.Text,
       Source={StaticResource ViewModelLocator}}"