2013-09-11 77 views
1

環境:WinRT中/ XAML/C#XAML雙向綁定到可空類型

我試圖做一個雙向的float類型屬性的綁定。但是,如果這是一個可爲空的類型(float?或Nullable),綁定不起作用。 我有事件應用轉換器爲此,它仍然沒有顯示任何可綁定性的跡象。

C#:視圖模型

public class MyViewModel : INotifyPropertyChanged 
{ 
    private float _quantity1; 
    public float Quantity1 
    { 
     get 
     { 
      return this._quantity1; 
     } 
     set 
     { 
      this._quantity1 = value; 
      RaisePropertyChanged("Quantity1"); 
     } 
    } 

    private float? _quantity2; 
    public float? Quantity2 
    { 
     get 
     { 
      return this._quantity2; 
     } 
     set 
     { 
      this._quantity2 = value; 
      RaisePropertyChanged("Quantity2"); 
     } 
    } 

    private Nullable<float> _quantity3; 
    public Nullable<float> Quantity3 
    { 
     get 
     { 
      return this._quantity3; 
     } 
     set 
     { 
      this._quantity3 = value; 
      RaisePropertyChanged("Quantity3"); 
     } 
    } 

    public MyViewModel() 
    { 
     this.Quantity1 = 100.01F; 
     this.Quantity2 = 200.02F; 
     this.Quantity3 = 300.03F; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected void RaisePropertyChanged(string propertyName) 
    { 
     System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged; 
     if ((propertyChanged != null)) 
     { 
      propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

C#:轉換器:

public sealed class NullableFloatConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     if (value == null) 
      return 0F; 
     else 
      return value; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     if (value != null) 
      return value; 
     else 
      return 0; 
    } 
} 

XAML:

<Page 
x:Class="Test_Binding.MainPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="using:Test_Binding" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d"> 
<Page.Resources> 
    <local:NullableFloatConverter x:Key="nullConverter" /> 
</Page.Resources> 
    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"> 
    <StackPanel> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="Quantity1: " Width="150" /> 
      <TextBox Text="{Binding Quantity1, Mode=TwoWay}" /> 
      <TextBlock Text="{Binding Quantity1}" /> 
     </StackPanel> 
     <!-- the second text block doesnt get an updated value --> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="Quantity2: " Width="150"/> 
      <TextBox Text="{Binding Quantity2, Mode=TwoWay, Converter={StaticResource nullConverter}}" /> 
      <TextBlock Text="{Binding Quantity2, Converter={StaticResource nullConverter}}" /> 
     </StackPanel> 
     <!-- the second text block doesnt get an updated value --> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="Quantity2 (No Converter): " Width="150"/> 
      <TextBox Text="{Binding Quantity2, Mode=TwoWay}" /> 
      <TextBlock Text="{Binding Quantity2}" /> 
     </StackPanel> 
     <!-- the second text block doesnt get an updated value --> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="Quantity3: " Width="150"/> 
      <TextBox Text="{Binding Quantity3, Mode=TwoWay}" /> 
      <TextBlock Text="{Binding Quantity3}" /> 
     </StackPanel> 
    </StackPanel> 
</Grid> 

僅第一個文本塊被(爲數量1 IE)更新。我不能讓其他人(Quantity2 & Quantity3)得到更新。 有什麼建議嗎?

+0

試圖調試屬性changed處理程序?嘗試設置綁定的'UpdateSourceTrigger'。 – UIlrvnd

+0

所有四個工作正常(非WinRT)Silverlight罰款。 – McGarnagle

回答

0

我覺得convertBack方法wasnt高達從無到有,這是我從stackoverflow.com/questions/15406336/databind-a-nullable-type-in​​-xaml-windows-8-store-app得到

public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     string s = value as string; 

     float result; 
     if (!string.IsNullOrWhiteSpace(s) && float.TryParse(s, out result)) 
     { 
      return result; 
     } 

     return null; 
    }