我有一个利用新的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>
答案 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中定义的控件的创建以使用该容器。