我遇到了一个问题,从后面的代码(我使用mvvm模式)绑定到WPF ListBox的选定项目的项目的选择。奇怪的是,它曾经工作,但现在它不再了。让我介绍一下情况。WPF列表框从mvvm中选择一个项目不再工作
这是我的用户内部列表框Cotrol
<ListBox ItemsSource="{Binding TrainerClassesList}"
DisplayMemberPath="Description"
SelectedItem="{Binding SelectedTrainerClass, Mode=TwoWay}" />
这是该选择的项目势必会在视图模型属性:
public TrainerClassClientEntity SelectedTrainerClass
{
get
{
return selectedTrainerClass;
}
set
{
if (EditingTrainerClass != null && !EditingTrainerClass.Equals(SelectedTrainerClass) && !EditingTrainerClass.Equals(value) && BtnSave.CanExecute(null))
{
MessageBoxResult result = MessageBox.Show("Unsaved changes will be lost. Do you want to save?",
"Attention",
MessageBoxButton.YesNo,
MessageBoxImage.Question,
MessageBoxResult.Yes);
if (result == MessageBoxResult.Yes)
{
BtnSave.Execute(null);
}
}
selectedTrainerClass = value;
EditingTrainerClass = Mapper.Clone<TrainerClassClientEntity>(selectedTrainerClass);
Raise(() => SelectedTrainerClass);
}
}
基本上会发生什么情况是,当你做更改用户控件的文本框等,您不会直接更改所选项目。您修改所选项目的副本,并且一旦按下保存按钮(此处未显示),就会应用更改。
我几天前取得的成就是一个简单的按钮,它将一个项目添加到列表中,并将其选中。它曾经工作,但现在它不再了。这是按钮的动作(我使用ICommand接口来做到这一点,我不打算复制和粘贴整段代码)。
private void AddTrainerClass()
{
TrainerClassClientEntity trainerClass = new TrainerClassClientEntity();
ViewModel.TrainerClassesList.Add(trainerClass);
ViewModel.SelectedTrainerClass = trainerClass;
}
现在,我不完全知道我做了什么让它不再工作。它确实有效,通过调试我发现它确实改变了视图模型中的属性,但它似乎不会更新用户界面。
最近我在文本框中添加了一些验证器,可能是问题吗?这里有一个例子:
<TextBox Grid.Row="0" Grid.Column="1" Height="25" VerticalAlignment="Center" Margin ="10 5" >
<TextBox.Text>
<Binding Path="EditingTrainerClass.Description"
UpdateSourceTrigger="PropertyChanged"
Mode="TwoWay">
<Binding.ValidationRules>
<validators:StringNotNullOrWhiteSpaceValidationRule
ValidatesOnTargetUpdated="True"
ErrorMessage="The field cannot be empty."/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
此外,我认为值得一提的是我使用自定义的WPF主题。但是,它在我使用它的时候仍然工作。
提前感谢您的帮助。
林有点困惑你想要完成的任务。我虽然SelectedItem用于控制列表框中选择的项目,而不是用于检查更改。如果我想在覆盖之前的内容之前进行某种验证,我会保留一个用户可以返回的不同集合。 – user1029697
你是如何实现INotifyPropertyChanged的? – Chris
我只是想实际改变选择的项目。 是的,我正在实施INotifyPropertyChanged。 –