2009-06-08 6 views
4

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

, как показано ниже (предположим, что я 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. Ну, плата является обязательным полем, но поскольку привязка данных не будет конвертировать назад, я не могу предоставить информацию об ошибке, потому что мой класс не обновляется. Итак, я должен сделать следующее?

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

ответ

5

Это может быть сделано с помощью 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

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

+0

Я не уверен, согласен ли я с вами. Плата, похоже, является собственностью, с которой вы будете делать расчеты, поэтому она должна быть числовой. Все числовые поля будут вводиться через текстовые поля, принимающие строки. То, как вы это предлагаете, должно было бы реализовать все свойства, которые представляют числа как с строкой, так и с числовым вариантом. Используя конвертер, вы должны написать код преобразования только один раз. – Dabblernl

+1

Нет причин, по которым вам приходится писать код конверсии более одного раза - просто используйте его при необходимости. Обычно, однако, это просто вызов метода TryParse, поэтому там нет боли. Кроме того, размещение кода в виртуальной машине означает, что в представлении, где будут представлены дизайнеры, вы можете ошибиться. –

Смежные вопросы