2011-06-03 121 views
0

使用MVVM的WPF應用程序。我有一個TextBox的Text屬性綁定到視圖模型的十進制屬性。此屬性表示貨幣值。我希望TextBox以貨幣格式顯示數據。爲此,我在綁定中將StringFormat設置爲「c」。這按預期工作。WPF使用MVVM更改綁定格式

問題是,如果SourceUpdateTrigger是PropertyChanged,當用戶開始輸入時,輸入第一個字符後將應用格式,然後將光標定位在剛剛輸入的字符之前。這意味着下一個字符將在第一個之前而不是之後輸入。如果SourceUpdateTrigger是LostFocus,則用戶必須在確認按鈕被啓用之前將焦點轉移到另一個控件,這會在驗證貨幣字段之後發生。

我希望做的事情是處理GotFocus和LostFocus事件,獲取綁定的引用並更改其StringFormat屬性。我對MVVM沒有任何問題,因爲這是純粹的UI問題。問題是拋出了一個異常,我被告知綁定在使用後無法更改。

我考慮了各種其他選項,包括自定義轉換器。這雖然沒有奏效,因爲我無法解決如何使用ConverterParameter將控件的IsFocused屬性公開給轉換器。

任何人有任何想法?

回答

0

如何離開UpdateSourceTriggerLostFocus和處理TextChanged關於綁定調用ValidateWithoutUpdate

0

您可以在數據模板中使用數據觸發器來動態更改文本框的綁定。

<DataTemplate x:Key="DataTemplate1"> 
     <TextBox x:Name="TheTextBox" 
       Text="{Binding Path=ThePropertyPath, StringFormat={}{0:p0}, UpdateSourceTrigger=PropertyChanged}" /> 
    <DataTemplate.Triggers> 
     <!-- Set the TextBox.Text Binding but this time leave the StringFormat off --> 
     <DataTrigger Binding="{Binding Path=IsKeyboardFocusWithin, ElementName=TheTextBox}" Value="True"> 
      <Setter TargetName="TheTextBox" Property="Text" Value="{Binding Path=ThePropertyPath, UpdateSourceTrigger=PropertyChanged}" /> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding Path=IsFocused, ElementName=TheTextBox}" Value="True"> 
      <Setter TargetName="TheTextBox" Property="Text" Value="{Binding Path=ThePropertyPath, UpdateSourceTrigger=PropertyChanged}" /> 
     </DataTrigger> 
    </DataTemplate.Triggers> 
</DataTemplate>