我在XAML中有一个TextBox,我正在尝试将数据绑定到一个可以为空的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&amp; C#设计一个Windows应用商店。
提前致谢。
答案 0 :(得分:6)
我同意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不同。
答案 1 :(得分:2)
在绑定句柄TargetNullValue中。有点像:
您需要添加mscorlib:
xmlns:sys="clr-namespace:System;assembly=mscorlib"
并像这样更新你的绑定:
Source="{Binding Area,
TargetNullValue={x:Static sys:String.Empty},
Converter={StaticResource NullableValueConverter}}"
实际上,如果在XAML中检查空值,则不需要NullableValueConverter。这当然取决于您的转换器可能应该处理的其他内容。
或者,您可以实施IDataErrorInfo。这有点复杂了。
答案 2 :(得分:2)
对于Windows应用商店应用,Binding
类没有TargetNullValue
属性。
菲尔的方法是有效的,并且工作正常,只要确保你按照他的建议使用正确的方法签名(正如你在自己的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;
}
}