繁体   English   中英

WPF ListBox从mvvm中选择一项不再起作用

[英]WPF ListBox selecting an item from mvvm doesn't work anymore

我从后面的代码中选择绑定到WPF ListBox的选定项目的项目时遇到问题(我正在使用mvvm模式)。 奇怪的是,它曾经可以工作,但是现在不再了。 让我介绍一下情况。

这是我的用户控件中的列表框

<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主题。 但是,当我使用它时,它仍然可以正常工作。

预先感谢您的帮助。

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

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM