Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在每次使用MVVMLight WPF导航到页面时调用函数_C#_Wpf_Mvvm Light - Fatal编程技术网

C# 如何在每次使用MVVMLight WPF导航到页面时调用函数

C# 如何在每次使用MVVMLight WPF导航到页面时调用函数,c#,wpf,mvvm-light,C#,Wpf,Mvvm Light,这是我的设想。我有一个页面,从数据库中加载一个基列表。如果导航到该页面,将调用构造函数并调用loadbase()函数。这很好,正是我需要的 问题: 如果我离开页面,从另一个页面向数据库添加更多的基,然后返回,则不会调用构造函数,因此新基不会加载到基列表中 我尝试过的: 在MVVMLight中查看模型定位器 public class ViewModelLocator { static ViewModelLocator() { SetupNavigation();

这是我的设想。我有一个页面,从数据库中加载一个基列表。如果导航到该页面,将调用构造函数并调用loadbase()函数。这很好,正是我需要的

问题:

如果我离开页面,从另一个页面向数据库添加更多的基,然后返回,则不会调用构造函数,因此新基不会加载到基列表中

我尝试过的:

在MVVMLight中查看模型定位器

public class ViewModelLocator
{
    static ViewModelLocator()
    {
        SetupNavigation();
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
        SimpleIoc.Default.Register<BomConfiguratorContext>();

        if (ViewModelBase.IsInDesignModeStatic)
        {
            SimpleIoc.Default.Register<IUnitOfWork, UnitOfWork>();
        }
        else
        {
            SimpleIoc.Default.Register<IUnitOfWork, UnitOfWork>();
        }

        //   SimpleIoc.Default.Register<MainViewModel>();
        SimpleIoc.Default.Register<LoginViewModel>();
        SimpleIoc.Default.Register<UserNavigationViewModel>();
        SimpleIoc.Default.Register<AddNewBasesViewModel>();
        SimpleIoc.Default.Register<AddNewBillOfMaterialsViewModel>();
        SimpleIoc.Default.Register<AddNewOptionsViewModel>();
        SimpleIoc.Default.Register<AddNewRulesViewModel>();
        SimpleIoc.Default.Register<GenerateBillOfMaterialsViewModel>();

    }

    /// <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 LoginViewModel LoginViewModel
    {
        get{ return ServiceLocator.Current.GetInstance<LoginViewModel>(); }
    }
    public UserNavigationViewModel ManageRulesViewModel
    {
        get { return ServiceLocator.Current.GetInstance<UserNavigationViewModel>(); }
    }
    public AddNewBasesViewModel AddNewBasesViewModel
    {
        get { return ServiceLocator.Current.GetInstance<AddNewBasesViewModel>(); }
    }
    public AddNewBillOfMaterialsViewModel AddNewBillOfMaterialsViewModel
    {
        get { return ServiceLocator.Current.GetInstance<AddNewBillOfMaterialsViewModel>(); }
    }
    public AddNewOptionsViewModel AddNewOptionsViewModel
    {
        get { return ServiceLocator.Current.GetInstance<AddNewOptionsViewModel>(); }
    }
    public AddNewRulesViewModel AddNewRulesViewModel
    {
        get
        {
            SimpleIoc.Default.Unregister<AddNewRulesViewModel>();
            SimpleIoc.Default.Register<AddNewRulesViewModel>();
            return ServiceLocator.Current.GetInstance<AddNewRulesViewModel>();
        }
    }
    public GenerateBillOfMaterialsViewModel GenerateBillOfMaterialsViewModel
    {
        get{return ServiceLocator.Current.GetInstance<GenerateBillOfMaterialsViewModel>();}
    }

    /// <summary>
    /// Cleans up all the resources.
    /// </summary>
    public static void Cleanup()
    {
    }

    private static void SetupNavigation()
    {
        SimpleIoc.Default.Unregister<INavigationService>();
        var navigationService = new FrameNavigationService();
        navigationService.Configure("LoginView", new Uri("/Views/LoginView.xaml", UriKind.Relative));
        navigationService.Configure("UserNavigationView", new Uri("/Views/UserNavigationView.xaml", UriKind.Relative));
        navigationService.Configure("AddNewBasesView", new Uri("/Views/Bases/AddNewBasesView.xaml", UriKind.Relative));
        navigationService.Configure("AddNewBillOfMaterialsView", new Uri("/Views/BillOfMaterials/AddNewBillOfMaterialsView.xaml", UriKind.Relative));
        navigationService.Configure("AddNewOptionsView", new Uri("/Views/Options/AddNewOptionsView.xaml", UriKind.Relative));
        navigationService.Configure("AddNewRulesViewStep1", new Uri("/Views/Rules/AddNewRules/AddNewRulesStep1.xaml", UriKind.Relative));
        navigationService.Configure("AddNewRulesViewStep2", new Uri("/Views/Rules/AddNewRules/AddNewRulesStep2.xaml", UriKind.Relative));
        navigationService.Configure("AddNewRulesViewStep3", new Uri("/Views/Rules/AddNewRules/AddNewRulesStep3.xaml", UriKind.Relative));
        navigationService.Configure("AddNewRulesViewStep4", new Uri("/Views/Rules/AddNewRules/AddNewRulesStep4.xaml", UriKind.Relative));
        navigationService.Configure("AddNewRulesViewStep5", new Uri("/Views/Rules/AddNewRules/AddNewRulesStep5.xaml", UriKind.Relative));
        navigationService.Configure("AddNewRulesViewStep6", new Uri("/Views/Rules/AddNewRules/AddNewRulesStep6.xaml", UriKind.Relative));
        navigationService.Configure("AddNewRulesViewStep7", new Uri("/Views/Rules/AddNewRules/AddNewRulesStep7.xaml", UriKind.Relative));
        navigationService.Configure("GenerateBillOfMaterialsView", new Uri("/Views/BillOfMaterials/GenerateBillOfMaterialsView.xaml", UriKind.Relative));
        SimpleIoc.Default.Register<INavigationService>(() => navigationService);
    }
}
公共类ViewModelLocator
{
静态ViewModelLocator()
{
设置导航();
ServiceLocator.SetLocatorProvider(()=>SimpleIoc.Default);
SimpleIoc.Default.Register();
if(ViewModelBase.IsIndesignatic)
{
SimpleIoc.Default.Register();
}
其他的
{
SimpleIoc.Default.Register();
}
//SimpleIoc.Default.Register();
SimpleIoc.Default.Register();
SimpleIoc.Default.Register();
SimpleIoc.Default.Register();
SimpleIoc.Default.Register();
SimpleIoc.Default.Register();
SimpleIoc.Default.Register();
SimpleIoc.Default.Register();
}
/// 
///获取主属性。
/// 
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Performance”,
“CA1822:MarkMembersAstatic”,
justion=“此非静态成员用于数据绑定目的。”)]
公共LoginView模型LoginView模型
{
get{return ServiceLocator.Current.GetInstance();}
}
公共用户导航视图模型管理规则视图模型
{
get{return ServiceLocator.Current.GetInstance();}
}
公共AddNewBasesViewModel AddNewBasesViewModel
{
get{return ServiceLocator.Current.GetInstance();}
}
public AddNewBillOfMaterialsViewModel AddNewBillOfMaterialsViewModel
{
get{return ServiceLocator.Current.GetInstance();}
}
public addnewoptions视图模型addnewoptions视图模型
{
get{return ServiceLocator.Current.GetInstance();}
}
公共AddNewRulesViewModel AddNewRulesViewModel
{
得到
{
SimpleIoc.Default.Unregister();
SimpleIoc.Default.Register();
返回ServiceLocator.Current.GetInstance();
}
}
公共生成billofmaterialsviewmodel生成billofmaterialsviewmodel
{
get{return ServiceLocator.Current.GetInstance();}
}
/// 
///清理所有资源。
/// 
公共静态无效清除()
{
}
私有静态void SetupNavigation()
{
SimpleIoc.Default.Unregister();
var navigationService=new FrameNavigationService();
Configure(“LoginView”,新Uri(“/Views/LoginView.xaml”,UriKind.Relative));
Configure(“UserNavigationView”,新Uri(“/Views/UserNavigationView.xaml”,UriKind.Relative));
Configure(“AddNewBasesView”,新Uri(“/Views/base/AddNewBasesView.xaml”,UriKind.Relative));
Configure(“AddNewBillOfMaterialsView”,新Uri(“/Views/BillOfMaterials/AddNewBillOfMaterialsView.xaml”,UriKind.Relative));
Configure(“AddNewOptionsView”,新Uri(“/Views/Options/AddNewOptionsView.xaml”,UriKind.Relative));
Configure(“AddNewRulesViewStep1”,新Uri(“/Views/Rules/AddNewRules/addNewRulessStep1.xaml”,UriKind.Relative));
Configure(“AddNewRulesViewStep2”,新Uri(“/Views/Rules/AddNewRules/AddNewRulessStep2.xaml”,UriKind.Relative));
Configure(“AddNewRulesViewStep3”,新Uri(“/Views/Rules/AddNewRules/addNewRulessStep3.xaml”,UriKind.Relative));
Configure(“AddNewRulesViewStep4”,新Uri(“/Views/Rules/AddNewRules/addNewRulessStep4.xaml”,UriKind.Relative));
Configure(“AddNewRulesViewStep5”,新Uri(“/Views/Rules/AddNewRules/addNewRulessStep5.xaml”,UriKind.Relative));
Configure(“AddNewRulesViewStep6”,新Uri(“/Views/Rules/AddNewRules/addNewRulessStep6.xaml”,UriKind.Relative));
Configure(“AddNewRulesViewStep7”,新Uri(“/Views/Rules/AddNewRules/AddNewRulessStep7.xaml”,UriKind.Relative));
Configure(“GenerateBillOfMaterialsView”,新Uri(“/Views/BillOfMaterials/GenerateBillOfMaterialsView.xaml”,UriKind.Relative));
simpleoc.Default.Register(()=>navigationService);
}
}
查看采用INavigationService的模型

 private async void LoginAsync(IHavePassword parameter)
    {
       if( await Task<bool>.Run(() => Login(parameter)))
            _NavigationService.NavigateTo("UserNavigationView");

    }
这只是我如何注入导航服务并使用它导航页面的一个示例

public LoginViewModel(IUnitOfWork unitOfWork, INavigationService navService)
    {
        _UnitOfWork = unitOfWork;
        _NavigationService = navService;
        LoginCommand = new RelayCommand<IHavePassword>((IHavePassword parameter) => LoginAsync(parameter));
    }
公共登录视图模型(IUnitOfWork、INavigationService和navService)
{
_UnitOfWork=UnitOfWork;
_导航服务=导航服务;
LoginCommand=newrelaycommand((IHavePassword参数)=>LoginAsync(参数));
}
导航到页面

 private async void LoginAsync(IHavePassword parameter)
    {
       if( await Task<bool>.Run(() => Login(parameter)))
            _NavigationService.NavigateTo("UserNavigationView");

    }
private async void LoginAsync(IHavePassword参数)
{
if(wait Task.Run(()=>Login(参数)))
_NavigationService.NavigateTo(“用户导航视图”);
}
我要导航到的页面

这只是我如何在页面中使用数据上下文的一个示例

<local:BasePage x:Class="YAI.BomConfigurator.Desktop.Views.UserNavigationView"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  xmlns:local="clr-namespace:YAI.BomConfigurator.Desktop"
  mc:Ignorable="d" 
  d:DesignHeight="600" d:DesignWidth="800"
  Title="UserNavigationView"
  DataContext="{Binding ManageRulesViewModel, Source={StaticResource Locator}}">

<Border>
    <Grid>
        <ScrollViewer>
            <StackPanel
                VerticalAlignment="Center"
                HorizontalAlignment="Center"
                TextBlock.TextAlignment="Center">
                <Border Background="{StaticResource BackgroundLightBrush}"
                        CornerRadius="10"
                        Padding="15 50 15 15"
                        Width="600"
                        Margin="50 50 50 0">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition/>
                            <ColumnDefinition/>
                        </Grid.ColumnDefinitions>
                        <TextBlock Grid.ColumnSpan="2" Text="I Would Like To..." 
                                   FontSize="{StaticResource FontSizeLarge}"
                                   FontFamily="{StaticResource LatoRegular}"
                                   Foreground="{StaticResource MediumBlueBrush}"
                                   Margin="0 0 0 15"/>
                        <StackPanel Grid.Column="0" Margin="0 0 25 0">

                            <Button Content="Generate BOMs"
                                Margin="0 50 0 20"
                                Command="{Binding GenerateBillOfMaterialsCommand}"/>
                            <Button Content="Check Rules"
                                    Margin="0 25 0 20"
                                    Command="{Binding CheckRulesCommand}"/>
                            <Button Content="Add New Options"
                                    Margin="0 25 0 20"
                                    Command="{Binding AddNewOptionsCommand}"/>
                        </StackPanel>
                        <StackPanel Grid.Column="1">
                            <Button Content="Add New BOMs"
                                    Margin="0 50 0 20"
                                    Command="{Binding AddNewBillOfMaterialsCommand}" />
                            <Button Content="Add New Rules"
                                    Margin="0 25 0 20"
                                    Command="{Binding AddNewRulesCommand}"/>
                            <Button Content="Add New Bases"
                                    Margin="0 25 0 20"
                                    Command="{Binding AddNewBasesCommand}"/>
                        </StackPanel>

                    </Grid>
                </Border>
            </StackPanel>
        </ScrollViewer>
    </Grid>
</Border>

LoadAllDataCommand = new RelayCommand(async () => await LoadAllDataAsync());
 private async Task LoadAllDataAsync()
    {
        AllBases.Clear();
        try
        {
            using (var UOW = _UnitOfWorkFactory.Create())
            {
                foreach (Base ba in await Task.Run(() => _BaseRepository.GetAll()))
                {
                    AllBases.Add(ba);
                }
            }
        }
        catch (Exception)
        {
            await Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => {
                Messenger.Default.Send(new ToastErrorMessage { Message = "Error: There was a problem with loading the data" });
            }));
        }     
    }