[英]Binding to pseudo-static data in Windows Phone 8.1 with MVVM Light
為了盡量減少代碼量,我將嘗試將項目縮減為四個文件,並且僅關注text屬性(如果可以使文本工作,也可以使顏色工作)。 希望我們可以假設我的ViewModelLocator.cs,App.xaml,Generic.xaml和支持的ConnectivityStatusBar.cs已正確實現(必要時我也可以共享)。
<Page
x:Class="Client.View.HomePage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:customElements="using:Client.CustomElements"
mc:Ignorable="d"
DataContext="{Binding Source={StaticResource ViewModelLocator}}">
<Grid>
<StackPanel>
<customElements:ConnectivityStatusBar
Text="{Binding ConnectivityStatusBar.Text,
Source={StaticResource ViewModelLocator}}" />
<Button Content="Invert"
Command="{Binding HomePage.InvertConnectivityCommand}" />
</StackPanel>
</Grid>
</Page>
using Client.ViewModel;
using GalaSoft.MvvmLight;
namespace Client
{
public sealed class SessionData : ViewModelBase
{
private static readonly SessionData Instance = new SessionData();
private bool _online;
public static SessionData getInstance
{
get { return Instance; }
}
public bool Online
{
get { return _online; }
set
{
_online = value;
RaisePropertyChanged(() => Online);
RaisePropertyChanged(() => ConnectivityStatusBarViewModel.getInstance.Text);
}
}
}
}
using System;
using GalaSoft.MvvmLight;
namespace Client.ViewModel
{
public sealed class ConnectivityStatusBarViewModel : ViewModelBase
{
private static readonly ConnectivityStatusBarViewModel Instance = new ConnectivityStatusBarViewModel();
public static ConnectivityStatusBarViewModel getInstance
{
get { return Instance; }
}
public String Text
{
get { return SessionData.getInstance.Online ? "Online" : "Offline"; }
}
}
}
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
namespace Client.ViewModel
{
public class HomePageViewModel : ViewModelBase
{
public HomePageViewModel()
{
InvertConnectivityCommand = new RelayCommand(InvertConnectivity);
}
public RelayCommand InvertConnectivityCommand { get; set; }
private void InvertConnectivity()
{
SessionData.getInstance.Online = !SessionData.getInstance.Online;
}
}
}
這段代碼沒有給我想要的結果; 當在HomePage.xaml上按下按鈕時,文本不會更改。 如果將反轉方法放入ConnectivityStatusBarViewModel.cs中,它將起作用。
是否可以進行這項工作,還是我在浪費時間? 如果有可能,我如何更改我的方法以使其起作用?
編輯 :ViewModelLocator.cs看起來像:
using GalaSoft.MvvmLight.Ioc;
using Microsoft.Practices.ServiceLocation;
namespace Client.ViewModel
{
public class ViewModelLocator
{
static ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<ConnectivityStatusBarViewModel>();
SimpleIoc.Default.Register<HomePageViewModel>();
}
public ConnectivityStatusBarViewModel ConnectivityStatusBar
{
get { return ServiceLocator.Current.GetInstance<ConnectivityStatusBarViewModel>(); }
}
public HomePageViewModel HomePage
{
get { return ServiceLocator.Current.GetInstance<HomePageViewModel>(); }
}
}
}
您可以嘗試向其提供確切的實例,而不是在ViewModelLocator中注冊新的ConnectivityStatusBarViewModel實例。
SimpleIoc.Default.Register(() => ConnectivityStatusBarViewModel.getInstance);
這樣,當獲取實例的調用被調用時:
return ServiceLocator.Current.GetInstance<ConnectivityStatusBarViewModel>();
您實際上將返回該實例。
因此,當您綁定到VMlocator和ConnectivityStatusBar.Text時,它應該可以工作。
Text="{Binding ConnectivityStatusBar.Text,
Source={StaticResource ViewModelLocator}}"
您實際上是在綁定到另一個實例,這就是為什么未在UI中刷新數據的原因。
順便說一句,此代碼/您的代碼存在一些設計問題/冗余,但這超出了問題的范圍-我正嘗試對其進行最小的更改以使其正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.