2013-12-18 65 views
0

我正在使用IValueConverter將double轉換爲字符串。由轉換器創建的字符串不顯示在相應的文本框中。例如,如果用戶輸入1.1,則我的值轉換器可能將其格式設置爲'1'。不過,我仍然在文本框中看到'1.1'。我在調試器中驗證了轉換器的Convert()方法被調用,並返回'1'。我缺少一些基本的東西嗎?IValueConverter未更新wpf文本框

轉換器的方法如下:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    if (value == null) 
    { 
     return string.Empty; 
    } 
    if (value is double && targetType == typeof(string)) 
    { 
     string format = parameter == null ? "{0:F2}" : (string)parameter; 
     string formatted = string.Format(format, value); 
     return formatted; 
    } 
    return value.ToString(); 
} 

的XAML如下:

<TextBox x:Name="balance" Grid.Row="12" Grid.Column="1" 
Text="{Binding Balance, Converter={StaticResource nullableConverter}, ConverterParameter=\{0:F0 \}, ValidatesOnDataErrors=True, ValidatesOnExceptions=True, UpdateSourceTrigger=PropertyChanged}" Width="90" TextAlignment="Right" /> 

感謝。

+0

你看到綁定錯誤在輸出窗口在運行時? –

+0

不,我沒有看到任何錯誤。 – bdristan

+0

因此,您輸入「1.1」,將文本框中的標籤拖出以觸發'UpdateSourceTrigger = PropertyChanged',將DataContext中的'Balance'屬性更新爲'1.1',轉換器代碼運行並將'1.1'轉換爲'1' ,然後TextBox.Text仍然顯示'1.1'?那不應該是這種情況......你能按照所述的順序來確認這些確切的步驟嗎? – Rachel

回答

0

您的格式項(花括號內的東西)格式錯誤。

而不是

ConverterParameter=\{0:F0 \} 

嘗試

ConverterParameter='{}{0:F0} ' 

但是,我不知道是否設置Binding.StringFormat財產是不夠的?轉換將爲您處理(前後),您也可以進行驗證(至少在用戶輸入非數字文本的情況下)。

+0

該參數的語法似乎正常,因爲我按照預期在Convert()方法中看到它。此外,該方法中格式化的結果字符串是正確的。 – bdristan

0

進行雙向綁定,使其雙向流動。

+0

雙向綁定默認爲'TextBox.Text' – Rachel

+0

我相信默認情況下是雙向的。我明確表示了兩種方式,但沒有任何區別。 – bdristan

0

當Binding對象識別出ViewModel的「Balance」屬性發生了變化時,它只會運行該轉換器。

你的ViewModel是否有公共的Getter和Setter?

如果是這樣,當文本框中的數據正在改變時,綁定應該調用ViewModel上的屬性設置器。

接下來,您需要向視圖(和綁定)發回信號,表明屬性值已更改。您的視圖模型是否實現INotifyPropertyChanged?當Balance setter被調用時,您的viewmodel是否引發了PropertyChanged事件(PropertyName爲「Balance」)?

1

我相信這是一個已知的問題與使用上TextBox.Text轉換器時UpdateSourceTrigger=PropertyChanged

這通常不是一個理想的解決方案,因爲在用戶類型,該值被轉換,所以這可能會導致混亂和意外的結果爲用戶。

例如,如果用戶鍵入「1.1」,並且該值狀態越來越截斷爲「1」的每個按鍵後,事件的順序是:

  • 鍵入。現在
  • 轉換器的變化值,以1
  • 值是11

作爲一種變通方法,我通常建議僅施加格式化時文本框不具有使用觸發聚焦,像這樣:

<Style TargetType="{x:Type TextBox}"> 
    <Setter Property="Text" Value="{Binding Balance, Converter={StaticResource nullableConverter}, ConverterParameter=\{0:F0 \}" /> 

    <Style.Triggers> 
     <Trigger Property="IsKeyboardFocusWithin" Value="True"> 
      <Setter Property="Text" Value="{Binding Balance, ValidatesOnDataErrors=True, ValidatesOnExceptions=True, UpdateSourceTrigger=PropertyChanged}" /> 
     </Trigger> 
    </Style.Triggers> 
</Style>