Связывание UWP со свойством видимости FontIcon - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь связать свойство Visibility FontIcon со свойством enum в моей модели представления, используя конвертер, но по какой-то причине оно выдает исключение

Невозможно привести объект типа «Windows.UI.Xaml.Controls.FontIcon» к типу. 'Windows.UI.Xaml.Data.Binding'

Чего я хочу добиться, так это в зависимости от текущего значения CurrentSortOrder скрыть или показать значок внутри MenuFlyoutItem

Посмотреть код модели:

public class TestViewModel : ViewModelBase
{
    private TaskSortType _currentTaskSortOrder = TaskSortType.BY_NAME_ASC;
    public TaskSortType CurrentSortOrder
    {
        get => _currentTaskSortOrder;
        set => Set(ref _currentTaskSortOrder, value);
    }
}

Вид:

<Page
x:Class="UWPTests.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:converters="using:UWPTests.Converters"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="using:UWPTests"
xmlns:localModels="using:UWPTests.Models"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
DataContext="{x:Bind ViewModel}"
mc:Ignorable="d">

<Page.Resources>
    <converters:TaskSortTypeToVisibilityConverter x:Key="TaskSortTypeToVisibilityConverter" />
</Page.Resources>

<Grid>
    <AppBarButton Icon="Sort" Label="Sort">
        <AppBarButton.Flyout>
            <MenuFlyout>
                <MenuFlyoutSubItem Text="By name">
                    <MenuFlyoutItem Text="Asc">
                        <MenuFlyoutItem.Icon>
                            <FontIcon Glyph="&#xE73E;" Visibility="{Binding CurrentSortOrder, Mode=OneWay, Converter={StaticResource TaskSortTypeToVisibilityConverter}, ConverterParameter={x:Bind localModels:TaskSortType.BY_NAME_ASC}}" />
                        </MenuFlyoutItem.Icon>
                    </MenuFlyoutItem>
                    <MenuFlyoutItem Text="Desc">
                        <MenuFlyoutItem.Icon>
                            <FontIcon Glyph="&#xE73E;" Visibility="Collapsed" />
                        </MenuFlyoutItem.Icon>
                    </MenuFlyoutItem>
                </MenuFlyoutSubItem>
            </MenuFlyout>
        </AppBarButton.Flyout>
    </AppBarButton>
</Grid>

Преобразователь:

public class TaskSortTypeToVisibilityConverter : IValueConverter
{
    public Visibility OnTrue { get; set; }
    public Visibility OnFalse { get; set; }

    public TaskSortTypeToVisibilityConverter()
    {
        OnFalse = Visibility.Collapsed;
        OnTrue = Visibility.Visible;
    }

    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value is null || parameter is null)
            return Visibility.Collapsed;

        var currentOrder = (TaskSortType)value;
        var targetOrder = (TaskSortType)parameter;

        return currentOrder == targetOrder ? OnTrue : OnFalse;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        if (value is Visibility == false)
            return DependencyProperty.UnsetValue;

        if ((Visibility)value == OnTrue)
            return true;
        else
            return false;
    }
}

Любая помощь будет оценена

Edit:

Здесь я получаю исключение: this.InitializeComponent();

public sealed partial class MainPage : Page
{
    public TestViewModel ViewModel { get; set; }
    public MainPage()
    {
        ViewModel = new TestViewModel();
        this.InitializeComponent();
    }
}

Редактировать 2:

public enum TaskSortType
{
    BY_NAME_ASC = 0,
    BY_NAME_DESC = 1,
    BY_UPDATED_DATE_ASC = 2,
    BY_UPDATED_DATE_DESC = 3,
}

1 Ответ

0 голосов
/ 17 сентября 2018

Кажется, я не могу использовать x: Bind напрямую в ConverterParameter .. Поэтому я закончил со следующим:

Я добавил в ресурсы моей страницы:

<localModels:TaskSortType x:Key="TaskSortByNameAsc">BY_NAME_ASC</localModels:TaskSortType>
<localModels:TaskSortType x:Key="TaskSortByNameDesc">BY_NAME_DESC</localModels:TaskSortType>
<localModels:TaskSortType x:Key="TaskSortByUpdatedDateAsc">BY_UPDATED_DATE_ASC</localModels:TaskSortType>
<localModels:TaskSortType x:Key="TaskSortByUpdatedDateDesc">BY_UPDATED_DATE_DESC</localModels:TaskSortType>

Изатем я заменил привязку ConverterParameter на следующую:

 <FontIcon Glyph="&#xE73E;" Visibility="{Binding CurrentSortOrder, Mode=OneWay, Converter={StaticResource TaskSortTypeToVisibilityConverter}, ConverterParameter={StaticResource BY_NAME_ASC}}" />

Другой обходной путь - передать соответствующее значение в ConverterParameter, например ConverterParameter=0 или ConverterParameter="BY_NAME_ASC", и привести этот параметрк соответствующему значению перечисления

...