переключение видимости метки в виде списка - PullRequest
0 голосов
/ 07 апреля 2020

Я новичок в Xamarin. У меня есть просмотр списка, который связан с ObservableCollection с данными, поступающими из sqlite.

Вид списка имеет две метки. Я хочу скрыть одну из меток (lblGroup), когда кто-то нажимает на кнопку меню панели инструментов. Этот код не работает.

Вот код:

<StackLayout>
    <ListView x:Name="lstItems" HasUnevenRows="True" ItemSelected="lstItems_ItemSelected" >
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <StackLayout VerticalOptions="StartAndExpand"  Padding="20, 5, 20, 5" Spacing="3">
                        <Label x:Name="lblItemName" IsVisible="{Binding IsNameVisible}" Text="{Binding ItemName}" ></Label>
                        <Label x:Name="lblGroup" IsVisible="{Binding IsGroupVisible}" Text="{Binding ItemGroup}" ></Label>
                    </StackLayout>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackLayout>

В файле xaml.cs я привязываю ObservableCollection к моему списку.

public ObservableCollection<Items> itemsObs;
public ItemDetails()
{
    InitializeComponent();
    LoadItems();
}

private async LoadItems()
{
    List<Items> items = _con.QueryAsync<Items>(Queries.ItemsById(ItemsId));
    itemsObs = new ObservableCollection<Items>(items);
    lstItems.ItemsSource = itemsObs ;
}

private void menu_Clicked(object sender, EventArgs e)
{
    itemsObs.ToList().ForEach(a => a.IsGroupVisible = false);
}

1 Ответ

1 голос
/ 07 апреля 2020

В ответ Джейсона я полагаю, что вы не реализуете интерфейс INotifyPropertyChanged для свойства IsGroupVisible в классе Items, измените класс Items следующим образом:

 public class Items:ViewModelBase
{
    private bool _IsNameVisible;
    public bool IsNameVisible
    {
        get { return _IsNameVisible; }
        set
        {
            _IsNameVisible = value;
            RaisePropertyChanged("");

        }
    }

    private bool _IsGroupVisible;
    public bool IsGroupVisible
    {
        get
        { return _IsGroupVisible; }
        set
        {
            _IsGroupVisible = value;
            RaisePropertyChanged("IsGroupVisible");
        }
    }

    public string ItemName { get; set; }
    public string ItemGroup { get; set; }
}

Класс ViewModelBase реализует INotifyPropertychanged, чтобы уведомить данные изменились.

public class ViewModelBase : INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;


    public void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

И вы установили lstItems.ItemsSource = itemsObs, но вы изменили verseObs, то есть verseObs, я думаю, вы должны изменить itemsObs.

...