如何在主视图中设置属性以在WPF中显示实际视图

4dbbbstv  于 2023-03-19  发布在  其他
关注(0)|答案(2)|浏览(162)

我有一个简单的登录视图,其中包含用户名和密码,如果这两个在数据库中有效,我还想访问其他视图。问题是主导航在MainWindow.xaml中进行,其中包含menuItems,以及在MainViewModel中示例化CurrentViewModel属性。如果我从MainViewModel访问此属性,它将不执行任何操作,也不会发送实际选择的视图。除非我将LoginViewmodel中的DataContext更改为mainViewmodel。我该如何解决这个问题?如果听起来很愚蠢或简单,请原谅,但这是我第一个复杂的应用程序。我做错了什么?
如果我在登录中设置命令来处理它,它就会工作,但这不是过程进行的地方。
这是主视图模型:

private ObservableObject _selectedViewModel;
 public ObservableObject SelectedViewModel { 
get { return _selectedViewModel; } 
set { SetProperty(ref _selectedViewModel, value); }
 }    

public IRelayCommand<object> UpdateViewCommand { get; set; }

    public MainViewModel()
    {
        UpdateViewCommand = new RelayCommand<object>(e => Execute(e));
        SelectedViewModel = App.Current.Services.GetService<LoginViewModel>();
    }

    public void Execute(object parameter)
    {
        switch (parameter.ToString())
        {
            case "LogIn":
                SelectedViewModel = App.Current.Services.
                GetRequiredService<LogInViewModel>();
                break;
            case "ShowShops":
                SelectedViewModel = App.Current.Services.
                GetRequiredService<ShowShopsViewModel>();
                break;
        }
    }

登录视图模型:

private ILoginRepository<User> _userRepo;

        public IAsyncRelayCommand<User> LogIn { get; }

        public IAsyncRelayCommand UpdateViewCommand { get; }

        public LogInViewModel(ILoginRepository<User> userRepo)
        {
            _userRepo = userRepo;
            UpdateViewCommand = new AsyncRelayCommand<User>(e => LogIn(e), CanLogin);
        }

        public async Task LogIn(User user)
        {
            App.Current.Services.GetRequiredService<ShowShopsViewModel>();
        }
        public bool CanLogin(User user)
        {
            return true;
        }

MainWindow.xaml:

<Window.DataContext>
        <vm:MainViewModel/>
    </Window.DataContext>
<Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="30"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>

    <MenuItem Header="Show..."  Padding="10,0,10,0">
        <MenuItem Header="Devices" />
        <MenuItem Header="Shops" Command="{Binding UpdateViewCommand}" CommandParameter="ShowShops" />
        <MenuItem Header="Purchases" />
        <MenuItem Header="Logs" />
    </MenuItem>
<ContentControl Grid.Row="1" Content="{Binding SelectedViewModel}"/>

</Grid>

LoginView.xaml:

<UserControl>
.
.
.
.
<Button Style="{StaticResource LoginButton}" Command="{Binding UpdateViewCommand}" Content="Login" BorderBrush="Transparent" Background="Transparent" BorderThickness="0" Width="230" Height="25" >
</UserControl>
kpbpu008

kpbpu0081#

要更改视图,需要将MainViewModel.SelectedViewModel设置为新值。
问题是如何获得MainViewModel的示例,它被用作MainWindow.DataContext .如果你可以像App.Current.Services.GetRequiredService<MainViewModel>();一样访问它,我怀疑,那么你的登录方法可以看起来像:

public async Task LogIn(User user)
{
    App.Current.Services.GetRequiredService<MainViewModel>().SelectedViewModel = 
                App.Current.Services.GetRequiredService<ShowShopsViewModel>();
}

如果没有,那么你可以尝试将它作为CommandParameter传递:

<Button Style="{StaticResource LoginButton}" Command="{Binding UpdateViewCommand}" Content="Login" CommandParameter="{Binding DataContext, RelativeSource={RelativeSource AncestorType=local:MainWindow}}">

public async Task LogIn(object dc)
{
    (dc as MainViewModel).SelectedViewModel =
                App.Current.Services.GetRequiredService<ShowShopsViewModel>();
}
vxf3dgd4

vxf3dgd42#

最后经过几天设法解决了这个问题,我只是不得不在视图中添加数据上下文为:

DataContext = App.Current.Services.GetRequiredService<MainViewModel>();

相关问题