2

У меня есть текстовое поле в XAML, которое я пытаюсь привязать к привязке к nullable int. Это код для моего текстового поля и связанный конвертер:Databind тип NULL в приложении XAML Windows 8

<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; 
    } 
} 

Когда каждый я ввести число в это поле DataBind не похоже на работу и источник данных всегда остается нулевой. Как я могу обойти это?

Я использую XAML & C# для разработки приложения для магазина Windows.

Заранее спасибо.

ответ

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.

+0

Привет, Фил, спасибо за ответ. Пожалуйста, посмотрите мой комментарий на сообщение Sascha – Sun

+0

Спасибо за помощь – Sun

+1

Нет проблем. Думая об этом, вы можете удалить строку string.IsNullOrWhiteSpace, потому что int.TryParse вернет false для пустого или пробельного. – Phil

2

В вашей ручке привязки TargetNullValue. Несколько как:

Вам нужно добавить mscorlib:

xmlns:sys="clr-namespace:System;assembly=mscorlib" 

и обновить связывание следующим образом:

Source="{Binding Area, 
      TargetNullValue={x:Static sys:String.Empty}, 
      Converter={StaticResource NullableValueConverter}}" 

На самом деле вам не нужен NullableValueConverter, если проверить нулевое значение в ваш XAML. Это, конечно же, зависит от того, что еще может сделать ваш конвертер.

В качестве альтернативы вы можете реализовать IDataErrorInfo. Это немного сложнее.

+0

Благодарность за Ответить. Когда я добавляю ссылку, она жалуется на следующую ошибку: Неопределенное пространство имен CLR. URI «clr-namespace» относится к пространству имен «Система», которое невозможно найти. \t Я использую устройство RT для поверхности окна для этого приложения. Не уверен, что это что-то меняет? – Sun

+0

В некотором коде за файлом щелкните правой кнопкой мыши по ключевому слову типа String и выберите «Перейти к определению». Это должно открыть метаданные для класса, в котором указан тип. В верхней части вы увидите имя сборки и, конечно, пространство имен. Если они отличаются от указанных значений, замените их. –

+0

ОК, теперь я добавил следующую ссылку: xmlns: sys = "clr-namespace: System; assembly = System.Runtime", и компилятор принимает это. Теперь я получаю следующую ошибку: член «TargetNullValue» не распознается или недоступен. Нужна ли мне другая ссылка для получения TargetNullValue? – Sun

2

Нет TargetNullValue Недвижимость на Binding класс для приложений Windows Store.

подход Фила является действительным, и она отлично работает, просто убедитесь, что вы используете правильные подписи метод, как он предложил (и, как вы уже сделали в своей собственной версии 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; 
    } 
} 
+0

Спасибо за помощь – Sun