2011-01-17 14 views
8

[Using VS2010 & Expression Blend v4]konstrukcyjne dane czasowe w WPF

Hi - próbuje załadować niektórych danych w czasie projektowania w WPF i mieszanka, używając pojęcia Josh Smith jest tutaj: http://joshsmithonwpf.wordpress.com/2010/04/07/assembly-level-initialization-at-design-time/ przykład

[AttributeUsage(AttributeTargets.Assembly)] 
public class DesignTimeBootstrapperAttribute : Attribute 
{ 
    public DesignTimeBootstrapperAttribute(Type type) 
    { 
     var dep = new DependencyObject(); 
     Debug.WriteLine("here..?"); 
     if (DesignerProperties.GetIsInDesignMode(dep)) 
     { 
      // TODO: Design-time initialization… 
      IBootstrapper instance = Activator.CreateInstance(type) as IBootstrapper; 
      if (instance != null) 
      { 
       instance.Run(); 
      } 
     } 
    } 
} 

Z mojego atrybutu tutaj w AssemblyInfo.cs, gdzie AppBootstrapper rozciąga MefBootstrapper.

[assembly: AssemblyCopyright("Copyright © 2010")] 
[assembly: AssemblyTrademark("")] 
[assembly: AssemblyCulture("")] 
[assembly: DesignTimeBootstrapper(typeof(AppBootstrapper))] 

Nie chcę korzystać z przykładowych danych mieszanka, a), gdyż nie wydaje się, aby utworzyć dane dla ObservableCollection i b) Jestem w trybie projektowania z definicji, więc wszystko się zmieni dość dużo, ale moje "wygenerowane dane" nie będą.

W każdym razie nic się nie dzieje.

Pytanie 1: Jak można debugować czas inicjalizacji mojego bootstrapera? Q2: Czy potrzebuję dodatkowych przestrzeni/atrybutów mieszania itp. W moim widoku XAML?

(W moim bootstrapperie właśnie rejestruję inny moduł, w którym chcę zamienić RunTimeService na DesignTimeService, eksportując interfejs IService).

TIA

+0

masz udało się uczynić ten fragment kodu działa? – EngineerSpock

Odpowiedz

3

W tym celu debugowania:

  • Otwórz projekt w VS2010
  • ustawić punkt przerwania w zespole atrybut konstruktora
  • rozpocząć nową instancję mieszanka 4
  • Od VS2010 użyj opcji Debuguj -> Dołącz do procesu: i wybierz opcję Mieszaj
  • Przełącz na Mieszaj i otwórz projekt
  • Otwórz plik XAML, który odwołuje swoje dane przykładowe

Również każdy Debug.WriteLine powinna pojawić się w oknie wyjściowym VS2010.

Jeśli nie można uzyskać metoda atrybut do pracy (nie próbowałem to sam), można użyć tej metody (co Użyłem) od MVVM Light:

private bool? _isInDesignMode; 

public bool IsInDesignMode 
{ 
    get 
    { 
     if (!_isInDesignMode.HasValue) 
     { 
      var prop = DesignerProperties.IsInDesignModeProperty; 
      _isInDesignMode = 
       (bool)DependencyPropertyDescriptor 
       .FromProperty(prop, typeof(FrameworkElement)) 
       .Metadata.DefaultValue; 
     } 

     return _isInDesignMode.Value; 
    } 
} 
+1

Więc w swoim ViewModelu sprawdzasz, czy to prawda, a następnie zwrócisz fałszywe dane z własności VM, np. ObservableCollection? Problemem, który mogłem wtedy zaobserwować, byłoby podłączenie ViewModel i View, ponieważ używam MEF i Prism. Spojrzę na sposób, w jaki mówisz, żeby połączyć się z vs2010 i mieszać, więc może uda mi się to zrobić. Dzięki. – Ian