2016-12-02 3 views
1

У меня есть 2 текстовых поля в UWP. Они привязаны к целочисленным и десятичным свойствам объекта модели. Целое свойство сохраняется, но десятичное возвращает ошибкуНе удается сохранить десятичное свойство из UWP TextBox

Cannot save value from target back to source. BindingExpression: Path='ComponentDec' DataItem='Orders.Component'; target element is 'Windows.UI.Xaml.Controls.TextBox' (Name='null'); target property is 'Text' (type 'String'). 

Соответствующий XAML является:

    <ListView 
         Name="ComponentsList" 
         ItemsSource="{Binding Components}"> 
         <ListView.ItemTemplate> 
          <DataTemplate> 
           <StackPanel Orientation="Horizontal"> 
            <TextBox Text="{Binding ComponentInt,Mode=TwoWay}"></TextBox> 
            <TextBox Text="{Binding ComponentDec,Mode=TwoWay,Converter={StaticResource ChangeTypeConverter}}"></TextBox> 
           </StackPanel> 
          </DataTemplate> 
         </ListView.ItemTemplate> 
        </ListView> 

объект класса:

public class Component 
{ 
    public string ComponentCode { get; set; } 
    public string ComponentDescription { get; set; } 
    public int ComponentInt { get; set; } 
    public decimal ComponentDec { get; set; } 
    public override string ToString() 
    { 
     return this.ComponentCode; 
    } 
} 

Преобразователь беззастенчиво заимствовали из шаблона 10:

public class ChangeTypeConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     if (targetType.IsConstructedGenericType && targetType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) 
     { 
      if (value == null) 
      { 
       return null; 
      } 
      targetType = Nullable.GetUnderlyingType(targetType); 
     } 

     if (value == null && targetType.GetTypeInfo().IsValueType) 
      return Activator.CreateInstance(targetType); 

     if (targetType.IsInstanceOfType(value)) 
      return value; 

     return System.Convert.ChangeType(value, targetType); 
    } 

Почему не сохраняет десятичное свойство?

+0

Возможно, попробуйте изменить «десятичный» на «десятичный?». так как конвертер типов ищет что-то, что может быть обнуляемым – RoguePlanetoid

+0

Спасибо @RoguePlanetoid, но пробовал эту и ту же ошибку. – Vague

+1

Я немного отлаживал и выяснил, что когда он пытается сохранить значение обратно, метод 'Type targetType'' ConvertBack' является 'System.Object', а не' System.Decimal', но я понятия не имею, почему , Как насчет написания DecimalValueConverter? – schumi1331

ответ

1

Я получил его на работу, изменяя Binding ComponentDec к x:Bind ComponentDec

Я думаю, это потому, что x:Bind позволяет targetType быть передан как System.Decimal. В то время как Binding передает targetType как System.Object.

Чтобы использовать Binding Мне нужно будет написать DecimalConverter как предложено @ schumi1331.

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