我有:
以下是MainWindow.xaml中的框架:
<Frame x:Name="MainPage"
Content="{Binding ApplicationViewModel.CurentPage,
Source={x:Static viewMod:ViewModelLocator.Instanze},
Converter={local:ApplicationPageValueConverter}}"/>ApplicationViewModel是作为视图模型的应用程序状态:
public class ApplicationViewModel
{
/// <summary>
/// The current page of the application
/// </summary>
public ApplicationPage CurentPage { get; set; } = ApplicationPage.Login;
}ViewModelLocator从IoC中定位视图模型,以用于Xaml文件中的绑定。
public class ViewModelLocator
{
/// <summary>
/// Singleton instance of the locator
/// </summary>
public static ViewModelLocator Instance { get; private set; } = new ViewModelLocator();
/// <summary>
/// The application view model
/// </summary>
public static ApplicationViewModel ApplicationViewModel => IoC.Get<ApplicationViewModel>();
}在ApplicationPageValueConverter中,为了转换页面,我有以下内容:
public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
switch ((ApplicationPage)value)
{
case ApplicationPage.Login:
return new LoginPage();
case ApplicationPage.SignUp:
return new SignUpPage();
default:
Debugger.Break();
return null;
}
}在MainViewModel (即ViewModel for MainWindow.xaml.cs )中,我有一个按钮"SignUp",当我单击该按钮时,将执行正在执行此操作的ICommand:
public ICommand LoginCommand { get; set; }
LoginCommand = new RelayCommand(() => Login());
private void Login()
{
IoC.Get<ApplicationViewModel>().CurentPage = ApplicationPage.SignUp;
}ApplicationViewModel.CurentPage的值被更改为ApplicationPage.SignUp,但它不会转到ApplicationPageValueConverter来转换/显示页面。
这里是IoC 代码,OnStartup在这里做这个:
base.OnStartup(e);
IoC.SetUp();
....我不知道为什么它没有显示页面,我做错了什么?
发布于 2021-02-12 15:40:38
只要设置了ApplicationViewModel属性,INotifyPropertyChanged就应该实现CurrentPage并引发PropertyChanged事件:
public class ApplicationViewModel : INotifyPropertyChanged
{
private ApplicationPage _currentPage = ApplicationPage.Login;
/// <summary>
/// The current page of the application
/// </summary>
public ApplicationPage CurentPage
{
get { return _currentPage; }
set { _currentPage = value; NotifyPropertyChanged(); }
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = "") =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}要将更改通知视图并再次调用转换器,就需要这样做。
https://stackoverflow.com/questions/66171714
复制相似问题