我有以下情况。我想显示一个字符串列表。为了实现这一点,我将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方法中放置断点时,除了空字符串外,每个项目都会调用该方法。我怎样才能实现我的目标?
答案 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>
请注意两件事:
Text
中Textbox
的{{1}}部分,它使用DataTemplate
代替x:Bind
。请注意,默认情况下,编译时绑定是Binding
绑定(除非您明确提到模式),其中Legacy oneTime
默认为Binding
绑定。有关编译时绑定的更多信息,请参阅:xBind markup extension。OneWay
声明包含DataTemplate
属性,这有助于编译时绑定器知道它期望的数据类型。有关DataType
关于xBind markup extension。所有这一切,我强烈建议使用DataType
方法而不是Data Binding
方法与新的编译时绑定一样,很多转换由绑定引擎本身处理,导致代码更少为你而努力。我已经在github上提供了一个样本,您可以查看它:EmptyStringDemo