如何在Metro UI XAML中声明空字符串

4

我想编写一个简单的替代方案用于 WinRT DataTriggers 中缺少的功能,类似于:

<dt:DataTrigger Property="Message" Value="">
    <dt:Setter TargetName="tbMessage" Property="Visibility" Value="Collapsed" />
</dt:DataTrigger>

我有一个名为DataTrigger的类,其中有一个在XAML中设置的属性Value。我需要将Value设置为空字符串string.Empty。当我使用""(空括号)时,Value被设置为null而不是string.Empty。 我尝试在资源中定义空字符串:

<x:String x:Key="EmptyString"></x:String>

并且像这样使用它

<dt:DataTrigger Property="Message" Value="{StaticResource EmptyString}">
    <dt:Setter TargetName="tbMessage" Property="Visibility" Value="Collapsed" />
</dt:DataTrigger>

变量的值仍然为null。我尝试使用以下代码:

xmlns:sys="using:System" ... <sys:String x:Key="EmptyString"></sys:String>

这段代码会抛出异常 "An exception of type 'Windows.UI.Xaml.Markup.XamlParseException' occurred in mscorlib.dll but was not handled in user code

WinRT 信息: 找不到类型 'String'."

替代使用 <x:Static Member="sys:String.Empty" /> 的方法无法使用,因为在 WinRT 中缺少 x:Static

在 WinRT XAML 中声明空字符串是否可能?


你尝试过使用 ="{x:Null}" 吗? - Chris W.
是的,那么我的Value属性被设置为null,正如我所期望的,但我需要一个空字符串 :) - EugenSoft
1个回答

0

试试这个

<TextBlock Text="{x:Static System:String.Empty}" Name="emptyString"/>

不幸的是,x:Static仅适用于WPF,而不适用于WinRT。 - EugenSoft
抱歉,我没有在Win8上检查过。如果您尝试更改触发器,例如'<dt:DataTrigger Property="Message.Length" Value="0"> <dt:Setter TargetName="tbMessage" Property="Visibility" Value="Collapsed" /> </dt:DataTrigger>'? - Encarmine
是的,在这种特定情况下使用Message.Length可以解决我的问题。但是有两个原因我不能使用它: - EugenSoft
我能想到的唯一选择是创建一个{Binding}扩展,通过它来解决你的问题。 - Encarmine
1
是的,在我的情况下使用Message.Length解决了问题。但有两个原因我不能使用它:1. Message可能被设置为null,因此无法访问Length;2. 在DataTrigger代码中,如果DataTrigger的所有者实现了INotifyPropertyChanged接口,我将订阅OnPropertyChanged,以便可以跟踪Message的更改并应用Setters,但是字符串(Length属性的所有者类型)没有实现此接口;目前,我通过检查属性的类型是否为string并且值为null,如果是,则将null值替换为string.Empty来解决了我的问题,但对我而言,这样的代码有点不太好看 :) - EugenSoft
我尝试过使用Binding,但在WinRT中,这个类比本地的WPF要无用得多。 - EugenSoft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接