在XAMLWindows 8商店应用程序中绑定一个可空类型
本文关键字:一个 类型 绑定 XAMLWindows 应用程序 | 更新日期: 2023-09-27 18:03:56
我在XAML中有一个文本框,我试图将其绑定到一个可空的int。这是我的文本框和链接转换器的代码:
<TextBox x:Name="textArea" InputScope="Number" Text="{Binding Area, Mode=TwoWay, Converter={StaticResource NullableValueConverter}}" />
public class NullableValueConverter:IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
if (String.IsNullOrEmpty(value.ToString()))
{
return null;
}
return value;
}
}
当每次我在这个文本框中输入一个数字时,数据绑定似乎不起作用,数据源总是保留为空。我怎样才能避开这个问题呢?
我用的是XAML &c#设计一个windows store应用程序。
我同意Sacha的回答,但如果你需要一个NullableValueConverter一个改进将是
public class NullableValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter,
CultureInfo culture)
{
return value == null ? string.Empty : value.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter,
CultureInfo culture)
{
string s = value as string;
int result;
if (!string.IsNullOrWhiteSpace(s) && int.TryParse(s, out result))
{
return result;
}
return null;
}
}
请注意,这是使用WPF测试的,因此方法签名可能与WinRT不同。
在你的绑定句柄TargetNullValue。有点像:
需要添加mscorlib:
xmlns:sys="clr-namespace:System;assembly=mscorlib"
并像这样更新你的绑定:
Source="{Binding Area,
TargetNullValue={x:Static sys:String.Empty},
Converter={StaticResource NullableValueConverter}}"
实际上你不需要NullableValueConverter如果你检查一个空值在你的XAML。当然,这取决于你的转换器还可能处理什么。
或者你可以实现IDataErrorInfo。这有点复杂。
Windows Store应用程序的Binding
类中没有TargetNullValue
属性
Phil的方法是有效的,它工作得很好,只要确保你按照他的建议使用正确的方法签名(就像你在自己的NullableValueConverter
版本中所做的那样):
public class NullableValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
return value == null ? string.Empty : value.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
string s = value as string;
int result;
if (!string.IsNullOrWhiteSpace(s) && int.TryParse(s, out result))
{
return result;
}
return null;
}
}