2014-06-29 54 views
1

我是WPF的新手。將Unity容器傳遞給WPF轉換器類

我想知道如何進行依賴注入我IUnityContainer類,只有在XAML代碼有一個視圖模型。

小更新:
有一類名爲:LiveVideoTileControl - 我已經添加了容器吧。

我有窗戶,有一定的轉換:

<UserControl x:Class="Driver.Test.Views.LiveVideoTileControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:ViewModels="clr-namespace:Driver.Test.ViewModel" 
     xmlns:Driver="clr-namespace:Driver.Test.DriverRelated" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300" > 
    <UserControl.Resources> 
     <Driver:CameraToMediaElementConverter x:Key="converter"/> 
    </UserControl.Resources> 
    <ScrollViewer> 
    <Grid> 
      <ContentControl Content="{Binding CameraEntity,Converter={StaticResource converter}}" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"> 
     </ContentControl> 
    </Grid> 
    </ScrollViewer> 
</UserControl> 

我怎麼能注入容器類「CameraToMediaElementConverter」?

class CameraToMediaElementConverter : IValueConverter 
{ 
    public object Convert(object cameraEntity, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if ((cameraEntity as ICameraEntity) != null) 
     { 
      return DriverWrapper.GetControlForCamera((ICameraEntity)cameraEntity); 
     } 
     throw new NotImplementedException(); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

您必須手動執行(FactoryPattern或任何您喜歡的) - 本文:http://slickthought.net/post/2011/01/17/簡單依賴注入與 - XAML.aspx演示瞭如何注入到使用純XAML(但仍手動) – Carsten

+0

我想我可以總結我的2個參數中的1並把它作爲對象來轉換屬性(對象wrapperObj) ..而不是發送1對象在轉換(..) – ilansch

+0

否 - 這將使您的代碼不可讀 - 你看看我鏈接的文章?設置爲'converter'正確的,在你的XAML似乎是IMO – Carsten

回答

2

如果有人會以某種方式讓這裏看起來還是一個答案,這是我在我的應用程序沒有和它工作得很好。轉換器類的限制是您無法將引用傳遞給統一容器的實例,以通過構造函數注入您的服務。

在引導程序類,或者您在啓動時註冊服務的任何其他地方(這就是Prism的引導程序ConfigureContainer的一部分):

protected override void ConfigureContainer() 
    { 
     base.ConfigureContainer(); 
     Container.RegisterType<IShellViewModel, ShellViewModel>(); 
     Container.RegisterType<MyService>(new ContainerControlledLifetimeManager()); 
     Container.RegisterInstance<MyService>(new MyService()); 
     Application.Current.Resources.Add("IoC", this.Container); 
    } 

,請注意最後一行:

  Application.Current.Resources.Add("IoC", this.Container); 

並在轉換器類:

 UnityContainer unityContainer = (UnityContainer)Application.Current.Resources["IoC"]; 

現在你可以很容易地res olve Unity容器中的對象的任何實例:

service = (MyService) unityContainer.Resolve<MyService>(); 
相關問題