Невозможно присвоить нулевое значение через привязку TextBox для Int32 ?.
Если TextBox пуст, то Int32Null Set не вызывается.
Красная граница вокруг TexBox указывает на исключение из проверки.
Это просто не имеет смысла как Int32? обнуляемый Если пользователь удаляет целочисленное значение из TextBox, я хочу вызвать Set, чтобы свойство присваивалось null.
Когда он начинается int32Null = null и TextBox не красный.
Я попытался внедрить Validation и установить validation = true, если TextBox пуст. Но Set по-прежнему не вызывается, и TextBox красный, указывая на ошибку проверки.
Похоже, я должен иметь возможность присвоить нулевое значение обнуляемому через связывание.
<Window x:Class="AssignNull.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DataContext="{Binding RelativeSource={RelativeSource self}}"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBox Grid.Row="0" Grid.Column="0" Text="{Binding Path=Int32Null, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" />
<TextBox Grid.Row="2" Grid.Column="0" Text="{Binding Path=StringNull, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" />
</Grid>
</Window>
public partial class MainWindow : Window
{
private Int32? int32Null = null;
private string stringNull = "stringNull";
public MainWindow()
{
InitializeComponent();
}
public Int32? Int32Null
{
get { return int32Null; }
set { int32Null = value; }
}
public string StringNull
{
get { return stringNull; }
set { stringNull = value; }
}
}
Set StringNull вызывается, и переданное значение не является нулевым, а скорее string.empty.
Так как Set не вызывается в Int32Null, я не знаю, что передается.
Он также передавал string.empty в Int32 ?. Пришлось преобразовать пустую строку в ноль.
[ValueConversion(typeof(Int32?), typeof(String))]
public class Int32nullConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
Int32? int32null = (Int32?)value;
return int32null.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
string strValue = value as string;
if(string.IsNullOrEmpty(strValue.Trim())) return null;
Int32 int32;
if (Int32.TryParse(strValue, out int32))
{
return int32;
}
return DependencyProperty.UnsetValue;
}
}