Не можете присвоить нулевое значение Nullable Int32? через связывание - PullRequest
1 голос
/ 29 января 2012

Невозможно присвоить нулевое значение через привязку 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;
        }
    }

1 Ответ

1 голос
/ 29 января 2012

Вы делаете ложное предположение о том, как преобразователи типа должны справиться с этим. Так что, если они не делают то, что вы хотите, а именно превращаете пустую строку в null, вам придется либо написать свою собственную, либо использовать Binding.Converter, который сделает преобразование за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...