UWP 绑定不显示空值

Posted

技术标签:

【中文标题】UWP 绑定不显示空值【英文标题】:UWP Binding not showing empty value 【发布时间】:2020-02-05 07:37:52 【问题描述】:

我有一个 ListView 包含 Music(我的 ViewModel)列表,Music 有一个 string 属性 Album

但是,当Album 为空时,意味着它只是"",保存Album 的容器(HyperTextButton)不会显示空值。相反,它显示Music.ToString() 的值。并且虽然显示的是Music字符串,但HyperTextButton的内容实际上是空的,这可以在HyperTextButton的点击事件中确认。

如何让它正确显示空字符串?

这是ListView中的ItemTemplate

    <local:PlaylistControlItem DataContext="x:Bind" ShowAlbumText="Binding ElementName=PlaylistController, Path=ShowAlbumText">
        <local:PlaylistControlItem.ContextFlyout>
            <MenuFlyout Opening="OpenMusicMenuFlyout" />
        </local:PlaylistControlItem.ContextFlyout>
    </local:PlaylistControlItem>

这是显示AlbumControl

    <HyperlinkButton
        x:Name="AlbumTextButton"
        Grid.Row="0"
        Grid.Column="2"
        Margin="0,0,10,0"
        VerticalAlignment="Center"
        Click="Album_Click"
        Content="Binding Album"
        Foreground="Binding IsPlaying, Converter=StaticResource PlaylistRowColorConverter, ConverterParameter=Gray, Mode=OneWay"
        Style="StaticResource TextButtonStyle"
        Visibility="x:Bind ShowAlbumText, Converter=StaticResource VisibilityConverter, Mode=OneWay" />

ListView的源代码是here。

ItemTemplate 是here。

【问题讨论】:

【参考方案1】:

通过检查您的代码,主要问题在于 TextButtonStyle。在 TextButtonStyle 中,您还可以使用 textBlock 来实现绑定。它的DataContext是Music,所以它有时会调用Music.toString方法,而在你重写的toString方法中返回Path,所以会出现这种情况。

最快的解决方法是将AlbumTextButton的DataContext设置为Music.Album(这里改变的只是AlbumTextButton的DataContext,而不是Page的上下文),这样textBlock就会绑定到相册.在这种情况下,您不需要将 Album 绑定到 Button 的内容。或者您可以修改样式中的内容。

TextButton.xaml:

<HyperlinkButton
            x:Name="AlbumTextButton"
            Grid.Row="0"
            Grid.Column="2"
            Margin="0,0,10,0"
            VerticalAlignment="Center"
            Click="Album_Click"
            DataContext="Binding Album"
            Foreground="Binding IsPlaying, Converter=StaticResource PlaylistRowColorConverter, ConverterParameter=Gray, Mode=OneWay"
            Style="StaticResource TextButtonStyle"
            Visibility="x:Bind ShowAlbumText, Converter=StaticResource VisibilityConverter, Mode=OneWay" />

更新: 方法二

如果你想去掉下划线,你可以尝试使用系统提供的TextBlockButtonStyle。这种用法也不会显示下划线。

.xaml:

<HyperlinkButton
            x:Name="AlbumTextButton"
            Grid.Row="0"
            Grid.Column="2"
            Margin="0,0,10,0"
            VerticalAlignment="Center"
            Click="Album_Click"
            Content="Binding Album"
            Foreground="Binding IsPlaying, Converter=StaticResource PlaylistRowColorConverter, ConverterParameter=Gray, Mode=OneWay"
            Style="StaticResource TextBlockButtonStyle"
            Visibility="x:Bind ShowAlbumText, Converter=StaticResource VisibilityConverter, Mode=OneWay" />

【讨论】:

谢谢,但添加会使内容为空。 TextButtonStyle中的TextBlock已经实现了Binding,只需要修改DataContext即可。 您的意思是简单地将HyperlinkButton 中的Content=Binding Album 更改为DataContext=Binding Album?这会使内容为空。 是的。关于这个词:“那会使内容变空”。你的意思是在你测试之后,无论专辑是否有值,超链接按钮的内容总是显示为空?或者你认为改变后会导致空虚? HyperlinkBut​​ton 使用 TextButtonStyle,而 TextButtonStyle 有一个 TextBlock 可以显示内容。 OK,如果你使用style只是为了去掉下划线,你可以尝试使用系统提供的TextBlockButtonStyle,比如&lt;HyperlinkButton Style="StaticResource TextBlockButtonStyle" ......&gt;。这种用法也不会显示下划线。 TextButtonStyle 中的 TextBlock 确实是问题所在。如果之前提供的解决方案有问题,可以尝试从style来处理。

以上是关于UWP 绑定不显示空值的主要内容,如果未能解决你的问题,请参考以下文章

hadoop中空值显示0

将新项目添加到绑定的 ItemsSource 时,WinUI 3 UWP TabView 不显示新选项卡

UWP 从 TemplateSelector 更改为用户控件不再显示绑定

WPF——TargetNullValue(如何在绑定空值显示默认字符)

具有空值的 WPF ComboBox SelectedValue 绑定显示为空白

UWP SemanticZoom组绑定