【问题标题】:uwp - Boolean to visibility converter doesn't workuwp - 布尔到可见性转换器不起作用
【发布时间】:2019-01-03 16:18:41
【问题描述】:

我不明白为什么这么简单的事情会给我带来这么多麻烦,但仍然如此。 我有这个转换器:

public class BoolToVisibleConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value is bool && (bool)value)
            return Visibility.Visible;

        return Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        return (value is Visibility && (Visibility)value == Visibility.Visible);
    }
}

还有这个视图模型:

public class LoginViewModel: INotifyPropertyChanged
{
    private bool isHowToVisibile;

    public bool IsHowToVisible
    {
        get { return isHowToVisibile; }
        set { isHowToVisibile = value; Notify(nameof(IsHowToVisible)); }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void Notify(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public void ShowHowTo()
    {
        IsHowToVisible = true;
    }
}

在 XAML 中,我有一个按钮可以激活 ShowHowTo 并将 IsHowToVisible 更改为 true, 还有一个StackPanel,它的可见性我绑定到视图模型属性IsHowToVisible,它看起来像这样:

<AppBarButton Label="How To Play" Icon="Help" Click="{x:Bind loginViewModel.ShowHowTo}"/>

<StackPanel Name="HowTo" Grid.ColumnSpan="3" Grid.RowSpan="6" Visibility="{x:Bind loginViewModel.IsHowToVisible,Converter={StaticResource boolToVis},Mode=OneWay}">
    <Button Name="CloseHowTo" Content="Close" Click="CloseHowTo_Click" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="10,10,10,10"/>
    <Image  Source="Assets/HowTo.jpg"  Stretch="Fill" Margin="10,10,10,10"/>
</StackPanel>

XAML 通过以下方式了解转换器:

xmlns:con="using:MyApp.Converters"

<Page.Resources>
    <con:BoolToVisibleConverter x:Key="boolToVis"/>
</Page.Resources>

按钮有效。使用调试器显示视图模型中的属性确实更改为true,并且PropertyChanged 事件确实触发了。但就是这样。我在转换器中设置了一个断点,但它没有到达那里。

我尝试重建和部署,将模式更改为Mode=TwoWay,没有任何帮助。

我做错了什么?

【问题讨论】:

  • x:Bind 默认为OneTime,只计算一次。如果属性的初始值为true,是否会调用converter,将true转换为Visible?如果是这样,则转换器按预期工作。然后将模式更改为OneWayTwoWay - 无论哪种情况,您的代码都可以正常工作。

标签: mvvm uwp viewmodel uwp-xaml converters


【解决方案1】:

在我的测试中,您上面的代码运行良好,请确保您在关注&lt;con:BoolToVisibleConverter /&gt; xaml 时可以转到定义(或 F12)

另一方面,如果您的应用针对 Windows 10 版本 1607 及更高版本,您可以删除您的 BoolToVisibleConverter 代码,并且不需要在您的 xaml 中使用转换。从 Windows 10 版本 1607 开始,XAML 框架提供了内置的布尔到可见性转换器。转换器将 true 映射到 Visible 枚举值,将 false 映射到 Collapsed,因此您可以将 Visibility 属性绑定到布尔值,而无需创建转换器。请注意,这不是函数绑定的特性,只是属性绑定。要使用内置转换器,您的应用的最低目标 SDK 版本必须为 14393 或更高版本。当您的应用面向早期版本的 Windows 10 时,您无法使用它。

如果您仍然有这个问题,您可以创建一个可以重现它的最小示例。

【讨论】:

    猜你喜欢
    • 2014-03-23
    • 2013-08-18
    • 2019-12-18
    • 2011-09-24
    • 2017-11-09
    • 2012-10-10
    • 2019-01-24
    • 1970-01-01
    • 2016-06-02
    相关资源
    最近更新 更多