Представление WPF не отображается при изменении связанного свойства contentControl

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

XMAL:

<ContentControl Grid.Row="0" Content="{Binding MainContent, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"></ContentControl>

ИМУЩЕСТВО:

private UserControl _mainContent;
public UserControl MainContent
{
  get
  {
    return _mainContent;
  }
  set
  {
    _mainContent = value;
    OnPropertyChanged();
  }
}

КОД ЗА:

MainContent = new TestUserControl();

В СОБСТВЕННОСТИ ИЗМЕНЕНО:

    public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged(string propertyName)
{
  if (this.PropertyChanged != null)
  {
    this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
  }
}

protected virtual void OnPropertyChanged()
{
  string propertyName = new System.Diagnostics.StackTrace().GetFrame(1).GetMethod().Name.Substring(4);
  OnPropertyChanged(propertyName);
}

Моя проблема заключается в том, что на одной конкретной тестовой машине (похожей на другие, в ней нет ничего уникального или странного. Windows 7, 4 ГБ оперативной памяти и т. Д.) При изменении пользовательских элементов управления с использованием этого механизма приложение зависает.

Глядя на мои журналы, получена команда «Изменить», создается новый пользовательский элемент управления, запускается конструктор. Установлено свойство основного содержимого, запускается событие OnPropertyChanged.

а потом ничего. Приложение зависает, и Windows сообщает, что не отвечает, и закрывает приложение.

Событие OnLoaded пользовательского элемента управления никогда не запускается.

Это происходит при загрузке любого пользовательского элемента управления таким образом на конкретную машину.

Идеи, комментарии приветствуются. Приветствуются идеи, как это отладить.

ОБНОВЛЕНИЕ: поскольку это тестовая машина, она не очень часто перезагружается.

Как только мы перезагрузили машину, проблема исчезла. Я все еще хотел бы знать, почему и как это предотвратить снова.

PS. Целевая платформа - x86, а проблемная машина - x64, но в другом окне 7 x64 проблем не было. Мы используем .net framework 4.0


person SetiSeeker    schedule 06.07.2011    source источник
comment
На какую версию фреймворка вы ориентируетесь? Какая у вас конфигурация сборки (x86 / any / x64)? Целевая машина Windows 32 или 64-битная? Недавно у меня были проблемы на одной машине (Win 7 64 бит со сборкой для любого процессора) с другим странным поведением, и помогло только создание сборки для x64.   -  person hyp    schedule 06.07.2011
comment
Попробуйте преобразовать свое свойство MainContent в свойство зависимости. Вы можете привязать свойства зависимостей, определенные в коде позади вашего окна в xaml, дав окну имя и используя синтаксис ElementName, например {Binding ElementName = myWindow, Path = MainContent}. Это просто предположение. Посмотрим, поможет ли это. Вы также можете добавить в свою привязку PresentationTraceSources.TraceLevel = High и посмотреть, вернет ли результат что-нибудь полезное. В противном случае он догадался бы, что проблема в машине, а не в коде.   -  person dowhilefor    schedule 06.07.2011


Ответы (1)


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

protected virtual void OnPropertyChanged()
{
  string propertyName = new System.Diagnostics.StackTrace().GetFrame(1).GetMethod().Name.Substring(4);
  OnPropertyChanged(propertyName);
}

Ваши свойства будут встроены в режиме выпуска (и, возможно, во время вашей компиляции), поэтому имя свойства не было правильно идентифицировано поиском в стеке ...

person Chris Erickson    schedule 15.12.2011
comment
Такое использование StackTrace может быть опасным из-за встраивания метода при оптимизации кода. Хотя эта конкретная реализация может работать, потому что метод virtual и поэтому не будет встроен. - person Mike Zboray; 04.11.2012