首页 > 解决方案 > 如何在观看节目前显示 LoginPage?

问题描述

我创建了登录实体(Login.cs),还创建了登录类型为 DbSet 的登录属性,以将登录信息(SubBVDbContext.cs)保存为public DbSet<Login> Logins { get; set;},然后将条目播种到迁移文件夹中(Configuration.cs)中的登录表中. 之后,我创建了 (LoginPageViewModel.cs),其中包括包装所有实体的 LoginWrapper,以及允许从模型导航到另一个模型的 (NavigationView.xaml)。我已经创建了 (MainViewModel.cs) 和 MainWindow.xaml,其中包含模型的视图和它们之间的导航。我想要的是先显示 LoginPage 然后显示其他视图。

登录.cs

 public class Login
{
    public int Id { get; set; }

    [Required]
    [StringLength(50)]
    [EmailAddress]
    public string Email { get; set; }

    [Required]
    public string Password { get; set; }
}

LoginDetailView.xaml(用户控件)

<StackPanel Orientation="Horizontal">
        <TextBox Text="{Binding Login.Email, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
        <PasswordBox PasswordChar="{Binding Login.Password, UpdateSourceTrigger=PropertyChanged}" />
 </StackPanel>
 <Button Width="100" ToolTip="Login to Subcontractors" HorizontalAlignment="Center" Content="login"/>

NavigationViewModel.xaml (用户控件)

  <UserControl.Resources>
    <Style x:Key="NaviItemContainerStyle" TargetType="ContentPresenter">
        <Setter Property="HorizontalAlignment" Value="Left"/>
        <Setter Property="Margin" Value="2"/>
    </Style>
    <DataTemplate x:Key="NaviItemTemplate">
        <Button Content="{Binding DisplayMember}"
                Command="{Binding OpenDetailViewCommand}">
            <Button.Template>
                <ControlTemplate TargetType="Button">
                    <Grid x:Name="grid">
                        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Cursor" Value="Hand"/>
                            <Setter Property="FontWeight" Value="Bold"/>
                        </Trigger>
                        <Trigger Property="IsPressed" Value="True">
                            <Setter Property="Foreground" Value="DarkRed"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Button.Template>
        </Button>
    </DataTemplate>
</UserControl.Resources>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="300"/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <GroupBox Header="Subcontarctors">
        <ScrollViewer VerticalScrollBarVisibility="Auto"
              HorizontalScrollBarVisibility="Auto">
            <ItemsControl ItemsSource="{Binding Subs}"
                ItemContainerStyle="{StaticResource NaviItemContainerStyle}"
                ItemTemplate="{StaticResource NaviItemTemplate}"/>
        </ScrollViewer>
    </GroupBox>
    <GroupBox Header="POs" Grid.Row="1" >
        <ScrollViewer VerticalScrollBarVisibility="Auto"
              HorizontalScrollBarVisibility="Auto" >
            <ItemsControl ItemsSource="{Binding SubPOs}"
                ItemContainerStyle="{StaticResource NaviItemContainerStyle}"
                ItemTemplate="{StaticResource NaviItemTemplate}"/>
        </ScrollViewer>
    </GroupBox>
</Grid>

LoginPageViewModel.cs

public class LoginPageViewModel:ViewModelBase
{
    private LoginWrapper _login;
    private IMessageDialogService _messageDialogService;

    public LoginPageViewModel(IMessageDialogService messageDialogService)
    {
        _messageDialogService = messageDialogService;
    }

    public LoginWrapper Login
    {
        get { return _login; }
        private set
        {
            _login = value;
            OnPropertyChanged();
        }
    }
}

登录包装器.cs

 public class LoginWrapper : ModelWrapper<Login>
{
    public LoginWrapper(Login model) : base(model)
    {
    }

    public int Id { get { return Model.Id; } }

    public string Email
    {
        get { return GetValue<string>(); }
        set { SetValue(value); }
    }

    public string Password
    {
        get { return GetValue<string>(); }
        set { SetValue(value); }
    }

}

应用程序.xaml.cs

private void Application_Startup(object sender, StartupEventArgs e)
    {
        var bootstrapper = new Bootstrapper();
        var container = bootstrapper.Bootstrap();

        var mainWindow = container.Resolve<MainWindow>();
        mainWindow.Show();
    }

注意:在 Bootstrapper 中有一个包含整个模型和视图的容器例如:

  public class Bootstrapper
{
    public IContainer Bootstrap()
    {
        var builder = new ContainerBuilder();

        builder.RegisterType<EventAggregator>().As<IEventAggregator>().SingleInstance();

        builder.RegisterType<SubBVDbContext>().AsSelf();

        builder.RegisterType<MainWindow>().AsSelf();
        builder.RegisterType<SubPODetailViewModel>().As<ISubPODetailViewModel>();
        builder.RegisterType<LoginPageViewModel>.AsSelf();

主窗口.xaml

<Window.Resources>
    <DataTemplate DataType="{x:Type viewModel:SubDetailViewModel}">
        <view:SubDetailView/>
    </DataTemplate>
    
    <DataTemplate DataType="{x:Type viewModel:SubPODetailViewModel}">
        <view:SubPODetailView/>
    </DataTemplate>

    <DataTemplate DataType="{x:Type viewModel:LoginPageViewModel}">
        <view:LoginDetailView/>
    </DataTemplate>
</Window.Resources>

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="200"/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <Menu Grid.ColumnSpan="2" FontSize="13">
        <MenuItem Header="Create">
            <MenuItem Header="New Subcontractor" Command="{Binding CreateNewDetailCommand}"
                  CommandParameter="{x:Type viewModel:SubDetailViewModel}"/>
            
            <MenuItem Header="New P.O." Command="{Binding CreateNewDetailCommand}"
                  CommandParameter="{x:Type viewModel:SubPODetailViewModel}"/>
        </MenuItem>
    </Menu>
    
    <view:NavigationView Grid.Row="1" DataContext="{Binding NavigationViewModel}"/>
    <ContentControl Grid.Row="1" Grid.Column="1" Content="{Binding DetailViewModel}"/>
</Grid>

模型视图 1 ,模型视图 2

解决方案资源管理器文件夹

我的 WPF 应用程序的链接: http ://www.filefactory.com/file/4of3jrkspmog/SubBvApp.zip

标签: c#wpfxamlmvvm

解决方案


推荐阅读