WPF 列表框从 mvvm 中选择项不再起作用

本文关键字:选择 不再 起作用 mvvm 列表 WPF | 更新日期: 2023-09-27 18:37:11

我在代码隐藏中绑定到 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主题。但是,当我使用它时,它仍然可以工作。

提前感谢您的帮助。

WPF 列表框从 mvvm 中选择项不再起作用

您有一个方法,您说应该将更改应用于[所选项目],但除非您从此方法中省略了一些代码,否则它似乎不会应用任何更改...您肯定需要将当前选定项目中的值复制到新项目吗?要么像这样:

private void AddTrainerClass()
{
    TrainerClassClientEntity trainerClass = new TrainerClassClientEntity(
        ViewModel.SelectedTrainerClass);
    ViewModel.TrainerClassesList.Add(trainerClass);
    ViewModel.SelectedTrainerClass = trainerClass;
}

或者像这样:

private void AddTrainerClass()
{
    TrainerClassClientEntity trainerClass = new TrainerClassClientEntity();
    trainerClass.CopyValuesFrom(ViewModel.SelectedTrainerClass);
    ViewModel.TrainerClassesList.Add(trainerClass);
    ViewModel.SelectedTrainerClass = trainerClass;
}