Уведомление об ошибке привязки базы данных WPF - PullRequest
4 голосов
/ 08 июня 2009

ОК, работаю над WPF (используя MVVM) и натолкнулся на вопрос, хочу какой-нибудь вклад. У меня простой класс

как показано ниже (предположим, у меня реализован IDataErrorInfo):

public class SimpleClassViewModel
{
  DataModel Model {get;set;}
  public int Fee {get { return Model.Fee;} set { Model.Fee = value;}}
}

Затем я пытаюсь привязать его к xaml:

<TextBox Text={Binding Fee, ValidatesOnDataErrors=true}/>

когда пользователь затем очищает текст, возникает ошибка привязки данных, потому что он не может преобразовать string.empty в int. Хорошо, поле Fee является обязательным, но поскольку привязка данных не преобразуется обратно, я не могу предоставить информацию об ошибке, поскольку мой класс не обновлен. Так я должен сделать следующее?

public class SimpleClassViewModel
{
  DataModel Model {get;set;}
  int? _Fee;
  public int? Fee 
  {
   get { return _Fee;} 
   set { _Fee = value;if (value.HasValue) { Model.Fee = value;}
  }
}

Ответы [ 2 ]

5 голосов
/ 08 июня 2009

Это можно сделать с помощью ValueConverter:

using System.Windows.Data;

namespace MyNameSpace
{
    class IntToStringConverter:IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return ((int) value).ToString();
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            int result;
            var succes = int.TryParse((string) value,out result);
            return succes ? result : 0;
        }
    }
}

Вы ссылаетесь на это в XAML таким образом:

<Window xmlns:local="clr-namespace:MyNameSpace">
   <Window.Resources>
      <local:IntToStringConverter x:Key="IntConverter"/>
   </Window.Resources>
   <TextBox Text={Binding Fee, ValidatesOnDataErrors=true,
            Converter={StaticResource IntConverter}}/>
</Window>
2 голосов
/ 09 июня 2009

Вы также можете воспользоваться тем, что вы используете MVVM, и изменить тип свойства Fee на string. В конце концов, ваша виртуальная машина должна предоставлять модель, которая поддерживает представление, и представление позволяет пользователям вводить string. Затем вы можете предоставить отдельное свойство, которое выставляет разобранный сбор как int. Таким образом, ваша логика преобразования прямо в свойстве Fee, что упрощает повторное использование, отладку и обслуживание.

...