MVVM RaisePropertyChanged 抛出 InvalidCastException
MVVM RaisePropertyChanged throws InvalidCastException
我的 ViewModel 第一次打开时运行良好,第二次打开它时,尽管我的 "loaded" eventToCommand 似乎发生了一些问题。当我第二次打开它时,我在 RaisePropertyChanged 上收到此异常:
System.InvalidCastException: 'Unable to cast object of type 'UwpApp.ViewModel.QuizTeamViewModel' to type 'UwpApp.Model.Round'.'
这与加载的命令有关吗?
视图模型
public QuizTeamViewModel(INavigationService navigationService)
{
_navigationService = navigationService;
MessengerInstance.Register<Quiz>(this, "SelectedQuiz", quiz => Quiz = quiz);
SelectionChangedCommand = new RelayCommand<Round>(ChangeSelectedRound);
ViewLoadedCommand = new RelayCommand(ViewLoaded);
ClickRankingQuizTeamCommand = new RelayCommand(OnRankingQuizTeamClick);
}
private void ViewLoaded()
{
if (Quiz == null) return;
Rounds = new ObservableCollection<Round>(Quiz.Rounds);
RaisePropertyChanged("Rounds");
FillQuizTeams();
}
private async void FillQuizTeams()
{
var quizTeamsToDisplay = new ObservableCollection<QuizTeamListViewModel>();
foreach (var quizTeam in Quiz.QuizTeams)
{
var team = await ApiService<Team>.GetAsync($"{StaticUri.GetUri()}/teams/quizTeam/{quizTeam.Id}");
quizTeam.Name = team.Name;
quizTeamsToDisplay.Add(new QuizTeamListViewModel(quizTeam, this));
}
QuizTeams = quizTeamsToDisplay;
RaisePropertyChanged("QuizTeams");
}
Xaml
<i:Interaction.Behaviors>
<core:EventTriggerBehavior EventName="Loaded">
<core:InvokeCommandAction Command="{Binding ViewLoadedCommand}" />
</core:EventTriggerBehavior>
</i:Interaction.Behaviors>
出于某种原因,我的组合框并不总是向我的命令发送 Round 对象,因此它试图将错误的对象转换为 Round。
我修复它的方法是将 SelectionChangedCommand 中的类型更改为对象,如果对象是 Round,则检查 RelayCommand 方法。
我的 ViewModel 第一次打开时运行良好,第二次打开它时,尽管我的 "loaded" eventToCommand 似乎发生了一些问题。当我第二次打开它时,我在 RaisePropertyChanged 上收到此异常:
System.InvalidCastException: 'Unable to cast object of type 'UwpApp.ViewModel.QuizTeamViewModel' to type 'UwpApp.Model.Round'.'
这与加载的命令有关吗?
视图模型
public QuizTeamViewModel(INavigationService navigationService)
{
_navigationService = navigationService;
MessengerInstance.Register<Quiz>(this, "SelectedQuiz", quiz => Quiz = quiz);
SelectionChangedCommand = new RelayCommand<Round>(ChangeSelectedRound);
ViewLoadedCommand = new RelayCommand(ViewLoaded);
ClickRankingQuizTeamCommand = new RelayCommand(OnRankingQuizTeamClick);
}
private void ViewLoaded()
{
if (Quiz == null) return;
Rounds = new ObservableCollection<Round>(Quiz.Rounds);
RaisePropertyChanged("Rounds");
FillQuizTeams();
}
private async void FillQuizTeams()
{
var quizTeamsToDisplay = new ObservableCollection<QuizTeamListViewModel>();
foreach (var quizTeam in Quiz.QuizTeams)
{
var team = await ApiService<Team>.GetAsync($"{StaticUri.GetUri()}/teams/quizTeam/{quizTeam.Id}");
quizTeam.Name = team.Name;
quizTeamsToDisplay.Add(new QuizTeamListViewModel(quizTeam, this));
}
QuizTeams = quizTeamsToDisplay;
RaisePropertyChanged("QuizTeams");
}
Xaml
<i:Interaction.Behaviors>
<core:EventTriggerBehavior EventName="Loaded">
<core:InvokeCommandAction Command="{Binding ViewLoadedCommand}" />
</core:EventTriggerBehavior>
</i:Interaction.Behaviors>
出于某种原因,我的组合框并不总是向我的命令发送 Round 对象,因此它试图将错误的对象转换为 Round。
我修复它的方法是将 SelectionChangedCommand 中的类型更改为对象,如果对象是 Round,则检查 RelayCommand 方法。