2016-06-07 18 views
0

Ich habe ein WPF-Programm mit Caliburn Micro gemacht, wo ich Singleton-Klassen für meine globalen Variablen verwendet habe, die in vielen Formen und Steuerungen verwendet werden.C# Wpf DataGrid Datenbindung an IOC Klasse

Jetzt verstehe ich, dass statische Klassen nicht empfohlen werden, also möchte ich sie mit einem IoC-Container refaktorieren.

Aber ich bin mir nicht sicher, wie ich zum Beispiel ein Datagrid an eine Klasse binden kann, die von meinem IoC-Container in meinem XAML verwaltet wird.

Vorher hatte ich

<Datagid ItemSource = "Source={x:StaticResource statics.class.instance}" ... 

Wie kann ich eine Bindung schaffen, die gegen den IoC-Container funktioniert?

+0

Haben Sie Instanzen dieser Klassen haben? Machen Sie sie Eigenschaften und binden Sie sie an ItemsSource = "{Binding SomeInstanceProperty.SomePropertyOfInstance}" '. – Sinatr

+2

Verwenden Sie wirklich MVVM? Da Sie über ein Ansichtsmodell verfügen und über Eigenschaften verfügen, können Sie diese Eigenschaften mit Werten füllen, die aus Ihrem IoC-Container abgerufen wurden, und dann die Datenquelle des DataGrid-Elements an eine dieser Eigenschaften binden. – Will

Antwort

0

Hier ist eine Art und Weise tun:

Aussicht: MyView.xaml

<UserControl x:Class="MyNamespace.MyView"> 
    <DockPanel> 
     <Datagid Name="MyItems"/> 
    </DockPanel> 
</UserControl> 

Die Ansicht Modell: MyViewModel.cs

namespace MyNamespace 
{ 
    class MyViewModel : PropertyChangedBase 
    { 
     public ObservableCollection<MyItem> MyItems { get; } 

     public MyViewModel(MyStaticClass myStaticClass) 
     { 
     MyItems = ConvertMyStaticClassToObservableCollection(myStaticClass); 
     } 

     ObservableCollection<MyItem> ConvertMyStaticClassToObservabeCollection(MyStaticClass myStaticClass) 
     { 
     ... 
     } 
    } 
} 

Schließlich müssen Sie Stellen Sie sicher, dass Sie Ihre statische Klasse als Singleton mithilfe Ihres IoC-Containers einrichten. Hier ist, wie Sie es mit SimpleInjector tun würde, innerhalb MyBootstrapper.cs:

protected override void Configure() 
{ 
    _container = new Container(); 

    _container.Register<IWindowManager, WindowManager>(); 
    _container.Register<IEventAggregator, EventAggregator>(); 

    _container.RegisterSingleton<MyStaticClass>(); 

    _container.Verify(); 
} 
+0

Hallo allerseits, danke für die Infos, die ich versuchen werde –