2010-10-06 3 views
0

У меня есть коллекция viewModels (InputViewModel) в другой viewModel (ScenarioManager). Каждый InputviewModel имеет экземпляр класса (RestOfInput), который содержит свойства, способные поднять OnPropertyChanged. , когда один из этих свойств изменяет событие обрабатываются с помощью этого метода (в InputViewModel):OnPropertyChanged реакция отличается в первый раз и второй раз

 public void TestAfterChanges(object sender, PropertyChangedEventArgs e) 
     { 
      MessageBox.Show("not ref"); 
      bool isInTheList = false; 
      RestOfInput roi = sender as RestOfInput; 
      string prop = e.PropertyName; 

      if (prop!="NameFile") 
      { 
       Difference d = new Difference(); 
       d.Length = prop; 
       d.Value1 = reference.RoI.getValueByPropertyName(prop); 
       d.Value2 = roi.getValueByPropertyName(prop); 

       foreach (Difference diff in _ListOfDifferences) 
       { 
        if (diff.Length==prop) 
        { 
         if ((Math.Abs(d.Value2-d.Value1)>0.001*d.Value1)) 
         { 
          //replace by le new one 
          _ListOfDifferences.Insert(_ListOfDifferences.IndexOf(diff), d); 
          _ListOfDifferences.Remove(diff); 
         } 
         else 
         { 
          //if change make the field value equal to the ref then remove from difference list 
          _ListOfDifferences.Remove(diff); 
         } 
         isInTheList = true; 
        } 

       } 

       if ((Math.Abs(d.Value2 - d.Value1) > 0.001 * d.Value1) && isInTheList==false) 
       { 
        _ListOfDifferences.Add(d); 
       } 

      } 


     } 

этот метод дает лишь краткое описание различий между данным конкретным случаем и в базовом случае.

Теперь, если ссылка случае изменения я должен обновить все случаи и событие обрабатывается в ScenarioManager:

public void refCaseChanging(object sender, PropertyChangedEventArgs e) 
    { 
     MessageBox.Show("ref"); 

     string propname = e.PropertyName;  
     foreach (InputViewModel item in _casesList) 
     { 
      if (item!=inpVM) 
      { 
       item.RoI.OnPropertyChanged(propname); 
      }     
     } 

    } 

inpVM является эталонным случаем.

Тогда у меня есть это поведение: -если я изменяю поле в случае, которое не является ссылочным: все в порядке. -если я изменяю конкретное поле в справочном примере: в первый раз все в порядке. Но второй раз, только базовый вариант и первый случай (в сборе), не базовый вариант обновляется> Это как цикл Еогеасп сломан ..

Все экспликации.

Если сообщение не ясно, пожалуйста, скажите мне (не легко объяснить;))

ответ

1

Исключение может объяснить, что обработка останавливается (хотя можно ожидать, что он будет пойман и отображается somewehre).

Вы пытались попросить ВС остановить вашу программу, когда выбрано исключение? (если вы этого еще не делали, перейдите в «Отладка/Исключения» и установите флажок для исключений CLR)

+0

Я думаю, что Тиморес на деньги. Я могу увидеть возможное исключение нулевой ссылки в item.RoI (не предполагайте, что передача через if (item! = InpVM) означает, что элемент не является нулевым), и исключение было поймано где-то в дереве выполнения, о котором вы не знали , +1 –

+0

Тиморес благодарен за ответ очень полезный: проблема в цикле foreach первого метода. Поскольку я изменяю Collection _ListOfDifference, цикл не может закончиться. – Gerrrard

+0

Tri Q, нет теста только потому, что ссылочный регистр принадлежит коллекции, но этот нельзя удалить. Хотя это никогда не является null.Thanks вы – Gerrrard

Смежные вопросы