2 Вопрос: Как использовать конвертер для включения / отключения элемента управления Xaml в формах Xamarin?

вопрос создан в Thu, May 2, 2019 12:00 AM

В качестве отправной точки мой тестовый проект представляет собой проект Xamarin Forms Tab - из шаблонов Xamarin.

У меня есть конвертер:

using System;
using System.Collections;
using System.Globalization;
using Xamarin.Forms;

namespace TabExample.Converters
{
    public class HaveItemsConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null && value is ICollection)
            {
                return ((ICollection)value).Count > 0;
            }
            return false;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

Я добавил его в App.xaml

<?xml version="1.0" encoding="utf-8" ?>
<Application xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:converters="clr-namespace:TabExample.Converters"
             x:Class="TabExample.App">
    <Application.Resources>
        <ResourceDictionary>
            <!-- Converters -->
            <converters:HaveItemsConverter x:Key="HaveItemsConverter"/>

            <!--Global Styles-->
            <Color x:Key="NavigationPrimary">#2196F3</Color>
            <Style TargetType="NavigationPage">
                <Setter Property="BarBackgroundColor" Value="{StaticResource NavigationPrimary}" />
                <Setter Property="BarTextColor" Value="White" />
            </Style>
        </ResourceDictionary>
    </Application.Resources>
</Application>

Я обновил ListView в ItemsPage.xml, чтобы добавить IsEnabled, используя конвертер.

        <ListView x:Name="ItemsListView" 
            ItemsSource="{Binding Items}"
            VerticalOptions="FillAndExpand"
             HasUnevenRows="true"
             RefreshCommand="{Binding LoadItemsCommand}"
             IsPullToRefreshEnabled="true"
             IsRefreshing="{Binding IsBusy, Mode=OneWay}"
             CachingStrategy="RecycleElement"
             ItemSelected="OnItemSelected"
             IsEnabled="{Binding Items, Mode=OneWay, Converter={StaticResource HaveItemsConverter}, Source={x:Reference BrowseItemsPage}}">

В ItemsPage.xaml.cs я добавил ItemsProperty:

    public List<Item> Items
    {
        get { return (List<Item>)GetValue(ItemsProperty); }
        set { SetValue(ItemsProperty, value); }
    }

    public static readonly BindableProperty ItemsProperty =
        BindableProperty.Create("Items", typeof(List<Item>), typeof(ItemsPage), null, BindingMode.OneWay);

Это не работает. Конвертер получает ноль. Мне нужен конвертер для использования Items ObservableCollection из ItemsViewModel:

    public ObservableCollection<Item> Items { get; set; }

Как мне привязать свойство в Xaml, чтобы использовать HaveItemsConverter для получения списка из ItemsViewModel и возврата bool, который используется для включения или отключения списка?

    
- 1
  1. Почему вы добавляете , Source={x:Reference BrowseItemsPage} в конце? Это не похоже на то, что вам нужно, поскольку вы привязываете свойство Items непосредственно несколькими строками выше.
    2019-05-02 14: 50: 19Z
  2. Я не знаю, что мне нужно для привязки, вот в чем вопрос. Что мне действительно нужно, так это привязать список в ViewModel - в данном случае это ObservableCollection < Item > Элементы, а не список в представлении.
    2019-05-02 16: 18: 11Z
  3. Отображаются ли элементы в ListView при удалении свойства IsEnabled? Если это так, {Binding Items} работает нормально, а это значит, что выполнение IsEnabled="{Binding Items, Mode=OneWay, Converter={StaticResource HaveItemsConverter}}", вероятно, должно работать.
    2019-05-02 16: 31: 15Z
  4. Эй, вы решили проблему?
    2019-05-07 01: 28: 17Z
2 ответа                              2                         

Причина:

Source={x:Reference BrowseItemsPage}

При установке источника BindingContext будет изменен одновременно;

Решение:

Что такое BrowseItemsPage? Если это ваша модель представления, вы должны установить BindingContext в contentPage. В противном случае просто используйте

IsEnabled="{Binding Items, Mode=OneWay , Converter={StaticResource HaveItemsConverter}}
    
0
2019-05-03 05: 52: 21Z

Я не получил полный код вашего кода, поэтому я предоставляю простое и быстрое решение, добавьте еще одно свойство, например ItemsAvailable,

bool _itemsAvailable;
Public bool ItemsAvailable 
{get {return _itemsAvailable;}}
{set {_itemsAvailable=value; RaisePropert....}}

И установите указанную выше переменную bool в свою коллекцию Observable , как показано ниже,

public ObservableCollection<Item> _items;
    public ObservableCollection<Item> Items
    {
        get
        {
            return _items;
        }
        set
        {
            _items = value;
            if(_items!=null && _items.Count>0)
            {
                ItemsAvailable = true;
            }
        }
    }

И привяжите это свойство ItemsAvailable для вашего Visible Property и удалите конвертер, который не требуется. Удачного кодирования:)

    
0
2019-05-03 09: 14: 48Z
источник размещен Вот