UWP 绑定到 FontIcon 的可见性 属性

UWP Binding to Visibility property of a FontIcon

我正在尝试使用转换器将 FontIconVisibility 属性 绑定到我的视图模型中的枚举 属性,但由于某种原因它抛出异常

Unable to cast object of type 'Windows.UI.Xaml.Controls.FontIcon' to type '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;
    }
}

如有任何帮助,我们将不胜感激

编辑:

我在这里得到异常: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,
}

看来我不能直接在 ConverterParameter 中使用 x:Bind ..所以我以以下内容结束:

我在我的页面资源中添加了:

<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=0ConverterParameter="BY_NAME_ASC" 并将该参数转换为相应的枚举值