如何通过单击列表视图显示标签

时间:2019-06-11 14:35:58

标签: xaml mvvm xamarin.forms label viewmodel

当我单击列表视图中的项目时,我想显示一个标签。 真正的问题我不知道如何在视图模型和视图之间建立链接

我想在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);
    }

3 个答案:

答案 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属性绑定到它。 代码将易于阅读和维护。