【问题标题】:Windows Phone Mvvm Light Navigate between ViewsWindows Phone Mvvm Light 在视图之间导航
【发布时间】:2016-01-08 23:10:18
【问题描述】:

我是 Windows 手机的新手。我想创建一个应用程序,但实际上我的 Binding 命令有问题。

我想点击,改变视图

在我的主页上,我有 2 个按钮:登录 / 在我的 MainPage.xaml 中的查看文件夹中注册

<phone:PhoneApplicationPage>

    <Grid>
        <Grid.Background>
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                <GradientStop Color="Black" Offset="0"/>
                <GradientStop Color="#FF563AA0" Offset="1"/>
            </LinearGradientBrush>
        </Grid.Background>

        <ContentControl Content="{Binding CurrentViewModel}" />

        <Button 
            Command="{Binding ConnexionViewCommand}"
            x:Name="Connexion_button" 
            HorizontalAlignment="Left" 
            Margin="90,308,0,0"
            Content="Login" 
            VerticalAlignment="Top" 
            Width="282"/>
        <Button 
            Command="{Binding InscriptionViewCommand}"
            x:Name="Create_account" 
            HorizontalAlignment="Left" 
            Margin="90,446,0,0"
            Content="Create Account" 
            VerticalAlignment="Top" 
            Width="282"/>
    </Grid>

</phone:PhoneApplicationPage>

我的文件夹 View 中有 3 个文件:ConnexionView.xaml 和 InscriptionView.xaml,以及 MainPage.xaml

我的 ViewModel 文件夹中有 5 个文件:ConnexionViewModel.cs、InscriptionViewModel.cs、MainPageViewModel.cs、MainViewModel.cs 和 ViewModelLocator.cs

我尝试遵循这个例子,但我不太了解。

http://www.codeproject.com/Articles/323187/MVVMLight-Using-Two-Views

我在我的 MainViewModel.cs 中添加了这段代码,但我不知道我现在要做什么。

namespace TeysserApp.ViewModel
{
    public class MainViewModel : ViewModelBase
    {
        private ViewModelBase _currentViewModel;

        readonly static ConnexionViewModel _ConnexionViewModel = new ConnexionViewModel();
        readonly static InscriptionViewModel _InscriptionViewModel = new InscriptionViewModel();
        readonly static MainPageViewModel _MainPageViewModel = new MainPageViewModel();


        public ViewModelBase CurrentViewModel
        {
            get
            {
                return _currentViewModel;
            }
            set
            {
                if (_currentViewModel == value)
                    return;
                _currentViewModel = value;
                RaisePropertyChanged("CurrentViewModel");
            }
        }
        public ICommand ConnexionViewCommand { get; private set; }
        public ICommand InscriptionViewCommand { get; private set; }

        public MainViewModel()
        {
            CurrentViewModel = MainViewModel._MainPageViewModel;
            ConnexionViewCommand = new RelayCommand(() => ExecuteCommandViewCommand());
            InscriptionViewCommand = new RelayCommand(() => ExecuteInscriptionViewCommand());
        }
        private void ExecuteConnexionViewCommand()
        {
            CurrentViewModel = MainViewModel._ConnexionViewModel;
        }

        private void ExecuteSecondViewCommand()
        {
            CurrentViewModel = MainViewModel._InscriptionViewModel;
        }

    }
}

这是我的 ViewModelLocator.cs

namespace TestApp.ViewModel
{
    /// <summary>
    /// This class contains static references to all the view models in the
    /// application and provides an entry point for the bindings.
    /// <para>
    /// See http://www.galasoft.ch/mvvm
    /// </para>
    /// </summary>
    public class ViewModelLocator
    {
        static ViewModelLocator()
        {
            ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

            if (ViewModelBase.IsInDesignModeStatic)
            {
                // SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
            }
            else
            {
                // SimpleIoc.Default.Register<IDataService, DataService>();
            }

            SimpleIoc.Default.Register<MainViewModel>();
            SimpleIoc.Default.Register<ConnexionViewModel>();
            SimpleIoc.Default.Register<InscriptionViewModel>();
        }

        /// <summary>
        /// Gets the Main property.
        /// </summary>
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
            "CA1822:MarkMembersAsStatic",
            Justification = "This non-static member is needed for data binding purposes.")]
        public MainViewModel Main
        {
            get { return ServiceLocator.Current.GetInstance<MainViewModel>(); }
        }
        public ConnexionViewModel ConnexionView
        {
            get { return ServiceLocator.Current.GetInstance<ConnexionViewModel>(); }
        }
        public InscriptionViewModel InscriptionView
        {
            get { return ServiceLocator.Current.GetInstance<InscriptionViewModel>(); }
        }
    }
}

这是我的 App.xaml

<Application
    x:Class="TeysserApp.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:views="clr-namespace:TeysserApp.Views"
    xmlns:vm="clr-namespace:TeysserApp.ViewModels"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone">

<Application.Resources>
    <vm:ViewModelLocator x:Key="Locator" />
    <ResourceDictionary>
        <DataTemplate DataType="{x:Type vm:ConnexionViewModel}">
            <view:ConnexionView />
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:InscriptionViewModel}">
            <view:InscriptionView />
        </DataTemplate>
    </ResourceDictionary>
    <local:LocalizedStrings xmlns:local="clr-namespace:TeysserApp" x:Key="LocalizedStrings"/>
</Application.Resources>

    <Application.ApplicationLifetimeObjects>
        <!--Objet requis qui gère les événements de durée de vie pour l'application-->
        <shell:PhoneApplicationService
            Launching="Application_Launching" Closing="Application_Closing"
            Activated="Application_Activated" Deactivated="Application_Deactivated"/>
    </Application.ApplicationLifetimeObjects>

</Application>

感谢您的帮助。

【问题讨论】:

    标签: c# wpf xaml windows-phone-8 mvvm


    【解决方案1】:

    MVVM Light 5Laurent 有介绍NavigationService

    public ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
    
        var navigationService = this.CreateNavigationService();
    
        SimpleIoc.Default.Register<INavigationService>(() => navigationService);
    
        SimpleIoc.Default.Register<IDialogService, DialogService>();
    
        SimpleIoc.Default.Register<MainViewModel>();
        SimpleIoc.Default.Register<DetailsViewModel>();
    }
    
    private INavigationService CreateNavigationService()
    {
      var navigationService = new NavigationService();
      navigationService.Configure("Details", typeof(DetailsPage));
      // navigationService.Configure("key1", typeof(OtherPage1));
    
    //From a working project.
    navigationService.Configure("tnc", new System.Uri("/Views/TncAgreement.xaml", System.UriKind.Relative));
    
    
     return navigationService;
    }
    

    你的 ViewModel

    public class MainViewModel : ViewModelBase
    {
    
     private INavigationService navigationService;
    
     public RelayCommand DetailsCommand { get; set; }
    
     public MainViewModel(INavigationService navigationService)
     {
         this.navigationService = navigationService;
    
          //Show Terms and condition agreement;
          navigationService.NavigateTo("tnc");
    
         DetailsCommand = new RelayCommand(() =>
        {
            navigationService.NavigateTo("Details", "My data");
        });
     }
    }
    

    类似的 SO Answer

    【讨论】:

    • 我不知道为什么 Frame.navigate 或 NavigationService 不起作用。我的 Frame.navigate 出现以下错误:无法将 System.String 转换为 System.Uri。对于我的 NavigationService.Navigate :该属性需要对象引用。方法或非静态字段“NavigationService.Navigate(Uri)
    • 我已经更新了答案,如果您仍然遇到问题,请添加有关哪一行引发异常等的详细信息
    【解决方案2】:

    当您按下Connexion 按钮时,方法ExecuteFirstViewCommand() 会运行但是这不存在,您需要更改lambda 操作方法ExecuteConnexionViewCommand()。如果这不能解决它,那么您可以在运行时调试代码并查看CurrentViewModel 是否正在更新。

    确保将其封装在资源字典中!

    <Application.Resources>
        <ResourceDictionary>
        </ResourceDictionary>
    </Application.Resources>
    

    【讨论】:

    • 我不能放下面的代码,因为上面写着:DataType 无法识别或无法访问。
    • 能否请您展示您在 App.Xaml 中放入的内容
    • 问题是(我认为)数据类​​型。当我将数据模板数据类型放入我的 App.xaml 时,我有以下代码:无法识别或无法访问数据类型。
    • 嗯,哪个特定部分无法访问 p.s 请确保您已检查我的回答中提到的那些方法,因为这会导致它无法正常工作。
    • “Windows Phone Silverlight 项目不支持 InscriptionView/ConnexionView。”您认为问题出在 Silverlight 项目吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多