我需要将SearchBar Text作为参数传递给ViewModel,但我不知道如何做到这一点。我唯一能做的就是获取代码背后的文本,并通过参数将其发送到ViewModel
商店.xml
SearchCommand="{Binding PesquisarButton}" SearchCommandParameter="{Binding .}" TextChanged="TextoMudou"
<SearchBar x:Name="searchBar" Grid.Column="0" Grid.Row="1" Margin="-5,10,0,10" BackgroundColor="Transparent" SearchCommand="{Binding PesquisarButton}" SearchCommandParameter="{Binding .}" TextChanged="TextoMudou" />
Shop.cs
在这里,我接受文本并将其作为参数发送到ViewModel,但我认为这是一种糟糕的方式
private void TextoMudou(object sender, EventArgs args)
{
palavra = ((SearchBar)sender).Text;
BindingContext = new ViewModel.ShopViewModel(palavra);
}
ShopViewModel.cs
我创建了一个"Text"变量,用于存储参数中的单词,并在命令中使用
public string Texto { get; set; }
建造商
public ShopViewModel(string palavra="")
{
this.Texto = palavra;
}
命令
在这里,我使用我创建的文本变量,但我希望这个命令接收参数
public ICommand btnBuscar => new Command(() =>
{
var ListaFiltrada2 = ListaRoupas.Where((item)=> item.Nome.Contains(Texto)).ToList();
Preencher(ListaFiltrada2);
});
我想要的是搜索栏文本直接进入视图模型中的命令,有办法吗?Github:https://github.com/IagoAntunes/FashionShop/tree/master/LojaRoupas/LojaRoupas
您需要在ViewModel中创建一个SearchCommand,如下所示:
public ICommand PerformSearch { get; set; }
视图中的模型构造函数:
public SearchPageViewModel()
{
PerformSearch = new Command<string>
((string query) =>
{
//use the query parameter for searching
});
}
下面是XMAL。正如您所看到的,我使用了一个小技巧,让您将Text属性作为CommandParameter传递,省去了绑定Text属性和使用它的工作量。
<SearchBar x:Name="searchBar"
HorizontalOptions="Fill"
VerticalOptions="CenterAndExpand"
SearchCommand="{Binding PerformSearch}"
SearchCommandParameter="{Binding Text, Source={x:Reference searchBar}}"/>
您可以在命令中发送任何对象,如下所示:
public Command<object> btnBuscar { get; set; }
public ViewModel() // Constructor
{
btnBuscar = new Command<object>(btnBuscarFunction);
}
private void btnBuscarFunction (object obj){
//Parse obj to any Type you want
string Texto = (string)obj;
var ListaFiltrada2 = ListaRoupas.Where((item)=> item.Nome.Contains(Texto)).ToList();
Preencher(ListaFiltrada2);
}
您可以传递命令以接收处理流程的函数。例如:
您的XAML:
<Button Text="OK"
BackgroundColor="#228B22"
BorderRadius="10"
Command="{Binding SaveCommand}"/>
然后在ViewModel中(使用异步作为最佳实践(:
private Command _SaveCommand;
public Command SaveCommand => _SaveCommand ??= new Command(async () => await SaveCommandExecAsync(string texto));
private async Task SaveCommandExecAsync(string texto)
{
string text = texto;
var ListaFiltrada2 = ListaRoupas.Where((item)=> item.Nome.Contains(text)).ToList();
Preencher(ListaFiltrada2);
}