2014-09-02 2 views
1

Я построил библиотеку классов, которая выступает в качестве GUI-структуры, которая может быть унаследована другими проектами. Это приложение основано на проектах Wild и Gemini.MVVM Приложение не восстанавливает состояние правильно

Моя проблема заключается в том, что при восстановлении макета Avalon док-станции с использованием стандартного сериалайзер

var layoutSerializer = new XmlLayoutSerializer(manager); 

manager где имеет тип DockingManager. Менеджер восстанавливает и пустую вкладку. Я предполагаю, что Caliburn Micro не может найти сохраненный ViewModel (названный HomeViewModel). Тем не менее, я изо всех сил пытаюсь это подтвердить.

Я считаю, что мой загрузчик правилен и что контейнеры MEF устанавливаются правильно, чтобы разрешить внешние типы. Я отлаживал проект до такой степени, что, по-моему, эта проблема возникает, и в окне вывода я вижу Attach(Home), где происходит прикрепление (обратите внимание, «Главная» - это отображаемое имя HomeViewModel). Тем не менее, я не знаю, что не так с процессом присоединения, поскольку это обрабатывается MEF/Caliburn.

Я действительно застрял отладки ли это интересно, если

  1. Любой может предложить любые проницательные советы о том, как приступить к процессу отладки?
  2. Кто-нибудь был бы готов взглянуть на решение?

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

Спасибо за ваше время.

+0

будет оценен рабочий образец, который может воспроизвести проблему. – pushpraj

+0

Привет, @pushpraj, большое спасибо за ваш ответ. Этот меня убивает! Вот ссылка на часть GUI проекта http://1drv.ms/1A4v40R. Это не самый маленький, так как у меня есть папка с пакетами. Если бы вы могли мне помочь, я бы желал предоставить вам репутацию. Кроме того, как только вы скачали это, не могли бы вы сообщить мне, чтобы я мог его заблокировать. Большое спасибо ... – MoonKnight

+0

Если вы создадите проект и запустите его, вы увидите, что откроется вкладка «Главная». Теперь по умолчанию все объекты 'Documents' или, точнее, объекты LayoutItemBase' имеют свойство' ShouldReopenOnStartup', равное false. Но если вы закрываете приложение, открыв вкладку «Главная», создается «ApplicationState.bin», и вы увидите, что «HomeViewModel» будет записан в открытые документы. Теперь, когда программа начинает резервное копирование, эти элементы не должны восстанавливаться, но это так. Мои мысли здесь в том, что тип не найден MED/CaliburnMicro ... – MoonKnight

ответ

2

как это обсуждалось и посмотрев на код примера, я понимаю, что следующий

  • HomeViewModel или можно сказать, LayoutItemBase не должно быть возобновлено, как ShouldReopenOnStartup установлен в ложном
  • , если закрыть приложение, оставляя открытый документ HomeViewModel восстанавливается при следующем запуске с пустым видом [Не OK]

Анализ

метод SaveState был правильно почитая ShouldReopenOnStartup значение и не излучающее состояния для HomeViewModel но менеджер дока был все еще испуская элемент для документа.

Так при следующем рестарт LoadState не находит сохраненное состояние, но было создан окно, как элемент присутствовал в состоянии макета менеджера докового

<LayoutDocument Title="HomePP" IsSelected="True" IsLastFocusedDocument="True" ContentId="d716f824-cfff-4b54-8fd6-2d026a99369a" .../> 

вы действительно пытались использовать e.Cancel свойство сериализации callback для отмены события, но похоже, что он не должен предотвращать загрузку окна, а просто для отмены события, если это не требуется.

Разрешение

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

вот как я сделал

ShellViewmodel.cs : Line 279 метод SaveState(string)

изменить следующий код

if (!item.ShouldReopenOnStartup) 
     continue; 

в

if (!item.ShouldReopenOnStartup) 
    { 
     //this item is not supposed to be restored so close the window before saving layout 
     IDocument doc = item as IDocument; 
     if (doc != null) 
      CloseDocument(doc); 
     continue; 
    } 
+0

Большое спасибо за то, что посмотрели на это. Это хороший компромисс. Моя путаница возникает из-за того, что обратный вызов десериализации не отменяет корректно. Кроме того, неясно, когда пустые «IDocument» запускаются во время операций состояния нагрузки; это не факт, что 'ShouldReopenOnStartup' игнорируется, а также о том, почему восстановленный' HomeViewModel' пуст. Кажется, что MEF не может разрешить этот «экспорт». Этот код, который я унаследовал от Близнецов, и на этом этапе я мог бы переписать так много, чтобы справиться с ошибкой, с которой у меня нет проблемы (пока). – MoonKnight

+0

Еще раз спасибо за ваше время. Я награжу вас щедростью за время, которое вы приняли со временем (13 часов @ 10:06 по Гринвичу) ... – MoonKnight

+0

Я рад быть вашей помощью, в то же время оценить вашу благодарность. Я также хочу подчеркнуть, что это не пустой документ IDocument, но это «элемент макета» менеджера док-станции, в котором размещается IDocument как контент. этот элемент макета сохраняется в файле состояния приложения через 'layoutSerializer.Serialize (stream)', а также восстанавливается при десериализации состояния через 'layoutSerializer.Deserialize (stream)'. во-вторых, ShouldReopenOnStartup является «настраиваемым свойством» из фреймворка gambit, поэтому менеджер макетов, возможно, не сможет распознать его. – pushpraj

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

  • Нет связанных вопросов^_^