用XAML进行依赖注入是否可能?

时间:2019-07-15 20:25:39

标签: c# xaml xamarin xamarin.forms prism

我有一个利用新的Xamarin Forms Shell Search的类来填充搜索栏的Items源,我想使用我的存储库来获取项目列表。

使用Prism MVVM框架,我宁愿使用DI而不是自己创建一个新实例。但是,这样做时,我的代码无法编译,因为XAML代码中引用的搜索处理程序会抱怨没有无参数的构造函数。有没有解决的办法?或者,还有更好的方法?请让我知道

搜索处理程序类(我希望如何)

public class IngredientsSearchHandler : SearchHandler
    {
        private readonly IUnitOfWork _unitOfWork;

        public IngredientsSearchHandler(IUnitOfWork unitOfWork)
        {
            _unitOfWork = unitOfWork;
        }

        protected override void OnQueryChanged(string oldValue, string newValue)
        {
            base.OnQueryChanged(oldValue, newValue);

            if (string.IsNullOrWhiteSpace(newValue))
            {
                ItemsSource = null;
            }
            else
            {
                ItemsSource = _unitOfWork.IngredientRepository.GetAll().Where(x => x.Name.ToLower().Contains(newValue.ToLower())).ToList();
            }
        }
    }

查看引用搜索处理程序的视图

错误是:“ 没有给出与'IngredientsSearchHandler.IngredientsSearchHandler(IUnitOfWork)'的必需形式参数'unitOfWork'相对应的参数”

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:controls="clr-namespace:TestApp.Controls"
             xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
             prism:ViewModelLocator.AutowireViewModel="True"
             mc:Ignorable="d"
             x:Class="TestApp.Views.IngredientsView">

    <Shell.SearchHandler>
        <controls:IngredientsSearchHandler Placeholder="Enter ingredient.."
                                           ShowsResults="true"
                                           DisplayMemberName="Name"
                                           Keyboard="Text">
            <controls:IngredientsSearchHandler.ItemTemplate>
                <DataTemplate>
                    <Grid Padding="10">
                        <Label Text="{Binding Name}"
                               FontAttributes="Bold"/>
                    </Grid>
                </DataTemplate>
            </controls:IngredientsSearchHandler.ItemTemplate>
        </controls:IngredientsSearchHandler>
    </Shell.SearchHandler>

    <ContentPage.Content>
            <Label Text="Test"/>
    </ContentPage.Content>
</ContentPage>

2 个答案:

答案 0 :(得分:1)

简单的答案是,您可以在ContainerProvider中使用XAML中的DependencyInjection。

<ContentPage xmlns:prism="http://prismlibrary.com"
             xmlns:converters="using:MyProject.Converters">
  <ContentPage.Resources>
    <prism:ContainerProvider x:TypeArguments="converters:SomeConverter" x:Key="someConverter" />
  </ContentPage.Resources>
</ContentPage>

答案 1 :(得分:1)

我要做的是完全删除IngredientsSearchHandler并将常规Query的{​​{1}}和ItemsSource绑定到视图模型的属性,并对查询的更改做出反应< em>那里(通过更新SearchHandler)。

视图模型会自动注入其依赖项(因为您使用了ItemsSource),而且我不知道有什么方法可以拦截在xaml中定义的控件的创建以使用该容器。