2011-11-18 19 views
6

ile bir çift için bağlanması WPF'nin TextBox'ı, Text özelliğinin bir bağını ViewModel'imdeki bir çift kullanarak kullanıyorum.Bir TextBox

Benim XAML şöyle görünür:

<TextBox Text="{Binding Path=MyDoubleValue, StringFormat=N2, UpdateSourceTrigger=PropertyChanged}" /> 

Ne yazık ki PropertyChanged için UpdateSourceTrigger geçmek ve tip değeri 12345 ben 12,354.00 (EDIT: 4 önce 5'e dikkat) olsun. Bu, imleci ,2 ve 3 arasında .NET biçimlendirici tarafından eklendikten sonra aynı yerde tutmanın bir sonucudur.

StringDüzeltimini PropertyChanged değerine ayarlanmış UpdateSourceTrigger ile nasıl kullanabilirim?

Not: Bu sadece Genellikle bu Doğrulama tetikler çünkü bağlayıcı bir TextBox.Text üzerinde PropertyChanged olmak ve bildirim bir tuşa basıldığında her zaman Değiştirme UpdateSourceTrigger istemiyoruz

+1

StrngFormat N2 kullanırken ne beklediğiniz 12,345,00 değil mi? Ne bekliyorsunuz? – Jens

+0

Evet, tam olarak, ancak bunun yerine 12,354,00 aldım. – baalazamon

+0

Biçim dizgisi basamakların değişmesine neden olmaz, başka bir şey olmalı –

cevap

8

.NET 4'te oluyor.

Eğer bunu yalnızca kullanıcı Enter'a basarsa, kaydetme komutunu işlemeden önce değeri kaydedecek şekilde yaparsanız, PreviewKeyDown olayına girmeyi ve tuşa basıldığında Enter'u manuel olarak güncellemeyi öneririm (Genellikle bu bir AttachedProperty)

private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Enter) 
    { 
     var obj = sender as UIElement; 
     BindingExpression textBinding = BindingOperations.GetBindingExpression(
      obj, TextBox.TextProperty); 

     if (textBinding != null) 
      textBinding.UpdateSource(); 
    } 
} 

ama bununla

hala UpdateSourceTrigger=PropertyChanged kullanmak istiyorsa, o zaman değerini gösterirken biçimlendirme kullanmayı düşünün, ancak kullanıcı tarafından düzenlenirken kaldırın söyleniyor olun.

<TextBox> 
    <TextBox.Style> 
     <Style TargetType="{x:Type TextBox}"> 
      <Setter Property="Text" Value="{Binding Path=MyDoubleValue, StringFormat=N2}" /> 
      <Style.Triggers> 
       <Trigger Property="IsFocused" Value="True"> 
        <Setter Property="Text" Value="{Binding Path=MyDoubleValue, UpdateSourceTrigger=PropertyChanged}" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </TextBox.Style> 
</TextBox> 
+0

'a özgü olduğunu biliyorum Dönüştürücülerle benzer bir şeye nasıl ulaşacağınız hakkında bir fikrin var mı? Mükemmel çözüm, yalnızca kontrol odaklanmamışsa biçimlendirme yapan bir dönüştürücüye sahip olmaktır. – baalazamon

+0

@baalazamon Eğer 'value.ToString (converterParameter)' işlevini döndürürseniz, StringFormat multi-converter yaratabilirsiniz. DataTriggers bu durumda gitmek için daha iyi bir yol olduğunu düşünüyorum – Rachel

+4

Bazı nedenlerden dolayı, bu çözümü kullanarak, boş bir "TextBox" ben "2.5" yazarak "2.5" yazarsanız, ondalık görünmüyor. İmleci daha fazla sağ dışında herhangi bir yere yeniden konumlandırırsam, ondalık yazabilirim. – epalm