2013-10-27 37 views
0

我遇到了一个问题,从后面的代码(我使用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主题。但是,它在我使用它的时候仍然工作。

提前感谢您的帮助。

+0

林有点困惑你想要完成的任务。我虽然SelectedItem用于控制列表框中选择的项目,而不是用于检查更改。如果我想在覆盖之前的内容之前进行某种验证,我会保留一个用户可以返回的不同集合。 – user1029697

+1

你是如何实现INotifyPropertyChanged的? – Chris

+0

我只是想实际改变选择的项目。 是的,我正在实施INotifyPropertyChanged。 –

回答

0

你有一种方法,你说是应该应用更改 [到选定的项目],但除非你已经从这个方法中省略了一些代码,它似乎并没有应用任何改变...肯定你需要将当前选定项目的值复制到新的项目中?要么是这样的:

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; 
} 
相关问题