ViewModel的参数命令



我需要将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);
}

最新更新