Как использовать конвертер для включения / отключения элемента управления Xaml в формах Xamarin? - PullRequest
0 голосов
/ 02 мая 2019

В качестве отправной точки мой тестовый проект представляет собой проект 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, который используется для включения или отключения списка?

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

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

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

И установите вышеупомянутую переменную bool под вашей наблюдаемой коллекцией Установите , как показано ниже,

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 голосов
/ 03 мая 2019

Причина:

Source={x:Reference BrowseItemsPage}

Когда вы установите Источник, BindingContext будет изменен одновременно;

Решение:

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

IsEnabled="{Binding Items, Mode=OneWay , Converter={StaticResource HaveItemsConverter}}
...