UWP绑定到FontIcon的可见性属性

时间:2018-09-17 00:30:15

标签: c# xaml uwp uwp-xaml

我正在尝试使用转换器将Visibility的{​​{1}}属性绑定到我的视图模型中的枚举属性,但是由于某种原因,它将引发异常

  

无法将类型为“ Windows.UI.Xaml.Controls.FontIcon”的对象强制转换为类型   'Windows.UI.Xaml.Data.Binding'

我要实现的是根据FontIcon的当前值在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();

编辑2:

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

1 个答案:

答案 0 :(得分:1)

似乎我不能直接在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"并将该参数强制转换为相应的枚举值