簡體   English   中英

使用MVVM Light綁定到Windows Phone 8.1中的偽靜態數據

[英]Binding to pseudo-static data in Windows Phone 8.1 with MVVM Light

所需結果

  • 大多數xaml頁面頂部的狀態欄,其顏色和文本根據布爾變量的值而變化。
  • 頁面背景也基於此布爾值設置為顏色。
  • 本質上,這些表示應用程序是否已連接到服務器; 除了反轉“在線”布爾值的方法之外,我們不需要在這里討論連接邏輯,以便模擬變化的連接狀態並測試綁定。
  • 我希望這些更新在每個視圖模型中都沒有重復的邏輯。

當前實施

為了盡量減少代碼量,我將嘗試將項目縮減為四個文件,並且僅關注text屬性(如果可以使文本工作,也可以使顏色工作)。 希望我們可以假設我的ViewModelLocator.cs,App.xaml,Generic.xaml和支持的ConnectivityStatusBar.cs已正確實現(必要時我也可以共享)。

  • HomePage.xaml:使用連接狀態欄的示例視圖。
<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>
  • SessionData.cs:在找到連接布爾值的地方,我嘗試將類設置為單例。
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);
            }
        }
    }
}
  • ConnectivityStatusBarViewModel.cs:確定狀態欄的顏色和文本應為邏輯。 我在這里嘗試過類似的單例邏輯。
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"; }
        }
    }
}
  • HomePageViewModel.cs:找到布爾反轉方法的位置。
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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM