当我单击列表视图中的项目时,我想显示一个标签。 真正的问题我不知道如何在视图模型和视图之间建立链接
我想在viewmodel中修改标签,但目前尚不知道。
我的xaml:
<StackLayout>
<Label x:Name="labelperso"
Text="{Binding newProduct}"
IsVisible="{Binding Addproduct}"
VerticalTextAlignment="Center"
HorizontalTextAlignment="Center"
BackgroundColor="#000000"
FontSize="20"
Opacity="0"/>
<ListView ItemsSource="{Binding Products}" CachingStrategy="RecycleElement" RowHeight="50" >
<ListView.ItemTemplate>
<DataTemplate>
<TextCell Text="{Binding CodeReferenceLibelle}" TextColor="Black"/>
</DataTemplate>
</ListView.ItemTemplate>
<ListView.Behaviors>
<b:EventToCommandBehavior EventName="ItemSelected" Command="{Binding
SelectCommand}" Converter="{StaticResource SelectedItemConverter}"/>
</ListView.Behaviors>
我的视图模型:
#region labelperso property
private string _newProduct;
public string newProduct
{
get { return _newProduct; }
set { SetProperty(ref _newProduct, value); }
}
#endregion
#region Addproduct property
private bool _Addproduct;
public bool Addproduct
{
get { return _Addproduct; }
set { SetProperty(ref _Addproduct, value); }
}
#endregion
当我点击我的商品时:
async Task Select()
{
newProduct = "Produit ajouté !";
basketManager.AddProductSkuAsync(sku);
newProduct = "";
await Task.Run(() => ShowText());
}
//I have tried this but I can't use my label in my view
async Task ShowText()
{
await labelperso.FadeTo(1);
await Task.Delay(1000);
await labelperso.FadeTo(0);
}
答案 0 :(得分:0)
您需要向虚拟机添加SelectedProduct
属性。
private string _SelectedProduct;
public string SelectedProduct
{
get { return _SelectedProduct; }
set { SetProperty(ref _SelectedProduct, value); }
}
然后可以将ListView的SelectedItem
绑定到它
<ListView ItemsSource="{Binding Products}"
SelectedItem="{Binding SelectedProduct}"
CachingStrategy="RecycleElement"
RowHeight="50" >
然后您可以通过“ nullToVisibility”转换器将其绑定到SelectedProduct,或使用触发器等来控制标签的可见性。
答案 1 :(得分:0)
您为什么要在VM中使用标签“ labelperso”?您可以在xaml.cs
中使用它。
您只需要像这样添加事件ItemSelected
:
<ListView ItemsSource="{Binding Products}" ItemSelected="OnSelection">
在xaml.cs
void OnSelection(object sender, SelectedItemChangedEventArgs e)
{
if (e.SelectedItem == null)
{
return;
}
//suppose the binding Object is Product
Product product = (Product)e.SelectedItem;
//labelperso.Text = "name = " + product.Name;
labelperso.FadeTo(1);
Task.Delay(1000);
labelperso.FadeTo(0);
}
通常,VM与Xaml无关,我们不应该从VM获得标签。 我们不推荐这样做,但是如果必须的话,可以像下面这样从xaml.cs文件中传递标签: 您可以在yourpage.xaml.cs中定义一个变量:
public Label pageLabel;
最初是这样的:
pageLabel = labelperso;
BindingContext = new YourViewmodel(this);
在YourViewmodel.cs中:
public Label ss;
public YourViewmodel(ContentPage parentPage)
{// here HomePage is your contentPage name of the page`
ss = ((HomePage)parentPage).pageLabel;//after this you can use it
}
答案 2 :(得分:0)
您应该尝试使用MVVM模式,而不是在背后隐藏代码。
使用MVVM,可以将Visible属性添加到视图模型,并将标签的IsVisible属性绑定到它。 代码将易于阅读和维护。