UWP,当ListView的项目源是字符串的集合时,将转换器应用于ListView的项目

时间:2017-09-11 23:12:25

标签: string listview uwp converter

我有以下情况。我想显示一个字符串列表。为了实现这一点,我将ListView绑定到一个字符串集合。在这个集合中,有一些空字符串。我想要的是在存在空字符串时显示以下文本:" -empty - "。这是我到目前为止所得到的(源代码仅用于演示目的):

EmptyStringConverter.cs

public class EmptyStringConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value is string && string.IsNullOrWhiteSpace((string)value))
        {
            return "-empty-";
        }
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

MainPage.xaml中

<Page
        x:Class="App1.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:App1"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">

    <Page.Resources>
        <local:EmptyStringConverter x:Key="EmptyStringConverter" />
    </Page.Resources>

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

        <ListView x:Name="ListView">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Converter={StaticResource EmptyStringConverter}}" Margin="0,0,0,5" />
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</Page>

MainPage.xaml.cs中

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        var source = new[] { "", "String 1", "String 2" };
        ListView.ItemsSource = source;
    }
}

当在EmptyStringConverter类的Convert方法中放置断点时,除了空字符串外,每个项目都会调用该方法。我怎样才能实现我的目标?

1 个答案:

答案 0 :(得分:0)

问题出在我检查的最后一个地方。导致问题的是Legacy Binding。我自己尝试了一个代码片段,然后我一块一块地替换它。以下行使用legacy binding

Text="{Binding Converter={StaticResource EmptyStringConverter}}"

由于您使用的是UWP,因此您可以切换到Compile time binding来修复您的问题,修改后的ListView XAML将是:

<ListView x:Name="ListView" >
        <ListView.ItemTemplate>
            <DataTemplate x:DataType="x:String">
                <TextBlock Text="{x:Bind Converter={StaticResource EmptyStringConverter},Mode=OneTime}" Margin="0,0,0,5" />
            </DataTemplate>
        </ListView.ItemTemplate>
</ListView>

请注意两件事:

  1. TextTextbox的{​​{1}}部分,它使用DataTemplate代替x:Bind。请注意,默认情况下,编译时绑定是Binding绑定(除非您明确提到模式),其中Legacy oneTime默认为Binding绑定。有关编译时绑定的更多信息,请参阅:xBind markup extension
  2. 如果您注意到OneWay声明包含DataTemplate属性,这有助于编译时绑定器知道它期望的数据类型。有关DataType关于xBind markup extension
  3. 的更多信息

    所有这一切,我强烈建议使用DataType方法而不是Data Binding方法与新的编译时绑定一样,很多转换由绑定引擎本身处理,导致代码更少为你而努力。我已经在github上提供了一个样本,您可以查看它:EmptyStringDemo