0

我在从后面的代码中选择绑定到 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 主题。但是,当我使用它时,它仍然可以正常工作。

提前感谢您的帮助。

4

1 回答 1

0

You have a method that you say is supposed to apply the changes [to the selected item], but unless you have omitted some code from this method, it doesn't appear to apply any changes... surely you need to copy the values from the current selected item to the new one? Either something like this:

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

Or something like this:

private void AddTrainerClass()
{
    TrainerClassClientEntity trainerClass = new TrainerClassClientEntity();
    trainerClass.CopyValuesFrom(ViewModel.SelectedTrainerClass);
    ViewModel.TrainerClassesList.Add(trainerClass);
    ViewModel.SelectedTrainerClass = trainerClass;
}
于 2013-10-27T16:15:04.913 回答