gpt4 book ai didi

c# - 在WPF MVVM中从一个 View 导航到另一个 View

转载 作者:行者123 更新时间:2023-12-03 10:57:35 30 4
gpt4 key购买 nike

我编写了应使用MVVM在WPF应用程序中的用户控件之间导航的代码,但我意识到该代码不起作用。
我想从LoginView窗口中将 View 更改为VotingCardView

实际上,单击LoginView中的按钮后,将执行DisplayVCV方法,但是 View 不会改变。我究竟做错了什么?

MainView.xaml:

<Window x:Class="ElectionCalculator.View.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ElectionCalculator"
xmlns:v="clr-namespace:ElectionCalculator.View"
xmlns:vm="clr-namespace:ElectionCalculator.ViewModel"
mc:Ignorable="d"
Title="Election calculator" Height="350" Width="525">
<Window.DataContext>
<vm:MainViewModel />
</Window.DataContext>
<ContentControl Content="{Binding ViewModel}" />
</Window>

LoginView.xaml:
<UserControl x:Class="ElectionCalculator.View.LoginView"
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:ElectionCalculator.View"
xmlns:vm="clr-namespace:ElectionCalculator.ViewModel"

mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">

<Grid>
<Button Command="{Binding DataContext.DisplayVC, RelativeSource={RelativeSource AncestorType={x:Type Window}}, Mode=OneWay}" Margin="161,147,47,124" />
</Grid>

</UserControl>

MainViewModel.cs
class MainViewModel : BaseViewModel
{
public BaseViewModel ViewModel { get; set; }

public MainViewModel()
{
ViewModel = new LoginViewModel();
}

public ICommand DisplayVC { get { return new RelayCommand(DisplayVCV); } }

public void DisplayVCV()
{
ViewModel = new VotingCardViewModel();

MessageBox.Show("DisplayVCCommandExecuted");
}
}

最佳答案

当值更改时,您的ViewModel属性实现不会引发PropertyChanged事件。通常这是通过 INotifyPropertyChanged 实现来完成的。因此,您的 View 不会收到有关某些更改的通知。

在您的情况下,这意味着您需要为ViewModel属性提供一个后备字段,并实现类似于以下内容的ViewModel属性:

private BaseViewModel _viewModel;
public BaseViewModel ViewModel
{
get { return _viewModel; }
set
{
if(_viewModel != value)
{
_viewModel = value;
OnPropertyChanged("ViewModel");
}
}
}

由于您已经从 BaseViewModel派生了,所以我假设在那里实现了 OnPropertyChanged方法(或某些名称相似的方法)。不必指定属性名称( "ViewModel")作为参数也是很常见的,因为许多实现为此目的使用 [CallerMemberName] 属性。

关于c# - 在WPF MVVM中从一个 View 导航到另一个 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40329131/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com