2013-04-29 7 views
1

У меня возникла самая неприятная проблема, с которой я столкнулся некоторое время, у меня есть настройка, как показано ниже, и недавно она перестала работать на компьютерах клиентов без причины (или нет причин, которые я могу сказать Заметьте, что я не менял код в этом разделе в течение нескольких месяцев, и это только начиналось на прошлой неделе), что происходит, когда текст не становится видимым, когда пользователь нажимает на редактирование, странно, что он работает 100 % в отладке, выпуске (с использованием VS2010) и установке программы на моем компьютере, и я в тупике, я могу вообще воспроизвести на своем компьютере. Мой вопрос просто (albiet немного расплывчатый) может кто-нибудь указать или сказать мне, где искать его отладить это?WPF привязка не обновляется должным образом

Разрез Модель (только типичное связывание):

private bool _editingSpecifications = false; 
    public bool EditingSpecifications 
    { 
     get { return _editingSpecifications; } 
     set 
     { 
      System.Windows.MessageBox.Show("In EditingSpecifications property PRE: "+value); 
      if (_editingTraceSpecifications == value) 
       return; 
      _editingSpecifications = value; 
      base.OnPropertyChanged("EditingSpecifications"); 
      System.Windows.MessageBox.Show("In EditingSpecifications property POST"); 
     } 
    } 

Вид:

<TextBox Visibility="{Binding Path=EditingSpecifications, Converter={StaticResource BoolToVis2}}" Text="{Binding Path=Specifications, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Width="262">...</TextBox> 

и конвертер:

public class BoolToVisibiltyConverter2 : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (targetType != typeof(Visibility)) 
      throw new InvalidOperationException("The target must be a Visibility"); 
     System.Windows.MessageBox.Show((bool)value + " :BoolToVisibiltyConverter2"); 
     if ((bool)value) 
      return Visibility.Visible; 
     return Visibility.Collapsed; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if ((Visibility)value == Visibility.Visible) 
      return true; 
     return false; 
    } 
} 

Ее установка MVVM, где ViewModel связывается с просмотр по требованию (т. е. когда пользователь хочет отредактировать и т. д.), приведенный выше код - это все, что я считаю уместным (если вам нужно больше просто спросить :)), как вы можете видеть, у меня есть некоторый MessageBox всплывал и от этого я получаю такой сценарий:
Пользователь загружает первых View хитов редактировать MessageBox выскакивает
1) «В EditingSpecifications собственности PRE:» + значение
2) значение (BOOL) + «: BoolToVisibiltyConverter2»
3) «В EditingSpecifications POST недвижимости»

Все работает, как ожидалось, однако по загрузке второй вид (обратите внимание, это может быть даже тот же вид просто закрыт и вновь открыт)
1) "В свойстве EditingSpecifications PRE:" + значение
2) (bool) значение + ": BoolToVisibiltyConverter2" - но не это, поэтому в других словах конвертер не вызывается во второй и последующих попытках редактирования спецификаций.
3) «В EditingSpecifications собственности POST»

Если вы снова попали редактирования в том же окне вы только получаете:
1) «В EditingSpecifications свойство PRE:» + значение - которое вроде как ожидается.

Edit- Бит Более подробно Проблема в том, что только на первой попытке редактирования будет текстовое поле станет видимым, и не будет видно на последующих запросах после закрытия и открытия вид:/И я чувствую имеет какое-то отношение к тому, что привязка не обновляется из ViewModel при запросе на обновление, но я не могу ее реплицировать.

И единственный способ сбросить это - закрыть и открыть программу, и, как я уже сказал, я могу только воспроизвести это поведение на компьютере клиентов и никогда не использовать самостоятельно. Так кто-нибудь может рассказать мне или указать мне в любом направлении, где искать, пожалуйста.

+0

Добавить окно с сообщением 'OnPropertyChanged()', чтобы узнать, действительно ли событие создано (т. Е. Если кто-нибудь его обрабатывает) –

+0

Пожалуйста, покажите свой код для «загрузка второго представления» и «нажмите править». И это не ваша проблема, но я думаю: «if (_editingTraceSpecifications == value)» должно быть «if (_editingSpecifications == value)» – MTR

+0

haha ​​yea sorry Я переименовал много вещей, прежде чем я разместил их здесь, чтобы не перейдя к проблеме с именами, возможно, просто пропустил ее, когда переименовал :) Я закончил просто переписывать сегмент кода, и он отлично работает, теперь, честно говоря, я ничего не менял, потому что, по-моему, это могло повлиять на него, за исключением, может быть, одной вещи, но это было Не объясняю, почему это нормально работает на моем компьютере, но не в другом:/ – Heinrich

ответ

0

Аналогичная проблема возникла в WPF 4.0 при навигации назад к странице: страница будет отображаться правильно, но привязки не будут работать. Обходной путь состоял в том, чтобы обернуть содержимое представления в DataTemplate, чтобы представление было создано заново каждый раз, когда оно отображалось.

Еще одна вещь, которую вы могли бы попробовать - установить DataContext в значение null, а затем вернуться к ViewModel, чтобы принудительно сбросить привязки.

Кстати: почему вы пишете свой собственный BooleanToVisibilityConverter? Есть один в System.Windows.Controls ...

+0

Я решил просто переписать этот сегмент кода и действительно в области вещей, которые я ничего не менял:/но теперь он работает, поэтому я просто собираюсь оставить его как есть, но то, что действительно меня беспокоило, было то, что он отлично работал на моем компьютере, но не на другом:/Что касается Datacontext, я уже настроил это для этого раньше :) Что касается BooleanToVis, Там есть? Когда я впервые начал искать что-то подобное, я ничего не смог найти (кроме пользовательских), поэтому просто решил написать свой собственный, он был достаточно прост для того, что мне было нужно, документация msdn FTW: P – Heinrich

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