2013-10-27 1 views
0

У меня возникла проблема с выбором элемента, привязанного к выбранному элементу WPF ListBox из кода (я использую шаблон mvvm). Странно то, что он работал, но теперь этого больше нет. Позвольте мне представить ситуацию.WPF ListBox, выбирая элемент из mvvm, больше не работает

Это ListBox внутри моего пользователя 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; 
     } 

Теперь я точно не знаю, что я сделал, чтобы оно больше не работало. Это работает, через отладку я узнал, что он меняет свойство в Model View, но похоже, что он не обновит пользовательский интерфейс.

Недавно я добавил некоторые валидаторы в текстовые поля, может быть, проблема? Вот пример:

<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

Im немного запутался о том, что вы хотите достичь. Я, хотя 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; 
} 
Смежные вопросы