我有一个简单的登录视图,其中包含用户名和密码,如果这两个在数据库中有效,我还想访问其他视图。问题是主导航在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>
2条答案
按热度按时间kpbpu0081#
要更改视图,需要将
MainViewModel.SelectedViewModel
设置为新值。问题是如何获得
MainViewModel
的示例,它被用作MainWindow.DataContext
.如果你可以像App.Current.Services.GetRequiredService<MainViewModel>();
一样访问它,我怀疑,那么你的登录方法可以看起来像:如果没有,那么你可以尝试将它作为
CommandParameter
传递:vxf3dgd42#
最后经过几天设法解决了这个问题,我只是不得不在视图中添加数据上下文为: