Как отобразить ярлык, нажав на просмотр списка - PullRequest
0 голосов
/ 11 июня 2019

Я хочу показать ярлык, когда я нажимаю на свой элемент в моем списке.Реальная проблема: я не знаю, как связать мою модель представления с моими представлениями

Я хочу изменить свой ярлык в модели представления, но я не знаю, возможно ли это в настоящее время.

Мой 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 голосов
/ 12 июня 2019

Почему вы хотите взять ярлык «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);
    }

Обычно ВМ не связаны с Xaml, и мы не должны получать метки от ВМ. И мы не рекомендуем этого. Но если нужно, вы можете передать Label из файла 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 
    }
0 голосов
/ 12 июня 2019

Вы должны попытаться использовать шаблон MVVM вместо взлома с кодом позади.

Используя MVVM, вы можете добавить свойство Visible к вашей модели представления и привязать к ней свойство IsVisible метки. Код будет намного легче читать и поддерживать.

0 голосов
/ 11 июня 2019

Вам необходимо добавить свойство SelectedProduct к вашей виртуальной машине.

private string _SelectedProduct;
public string SelectedProduct
{
    get { return _SelectedProduct; }
    set { SetProperty(ref _SelectedProduct, value); }
}

Затем вы можете привязать SelectedItem вашего ListView к нему

<ListView ItemsSource="{Binding Products}" 
          SelectedItem="{Binding SelectedProduct}"
          CachingStrategy="RecycleElement" 
          RowHeight="50" >

После этого вы можете контролировать видимость вашей метки, связываясь с SelectedProduct с помощью конвертера "nullToVisibility" или используя триггеры и т. Д.

...