WPF uygulamasında kullanıcının bir yüzde girebildiği bir TextBox'um var (int, 1 ile 100 arasında). Text özelliği, ViewModel'deki bir özelliğe verilerek veriyi setterde verilen aralıkta olacak şekilde zorlar. Ancak, .NET 3.5'de, zorlandıktan sonra UI'de veriler doğru şekilde gösterilmemiştir. WPF, this post on MSDN numaralı telefondan, ciltlemeyi manuel olarak güncellemeniz gerektiğini ve doğru gösterileceğini belirtir. Bu nedenle, UpdateTarget()
'u çağıran bir TextChanged
işleyicisine (Görünümde) sahibim.Coerce bir WPF TextBox artık çalışmıyor Not .NET 4.0
Görüntüle XAML: kodunda
<TextBox Text="{Binding Percentage, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, TargetNullValue={x:Static sys:String.Empty}}"
TextChanged="TextBox_TextChanged"/>
Görünüm codebehind:
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
// Removed safe casts and null checks
((TextBox)sender).GetBindingExpression(TextBox.TextProperty).UpdateTarget();
}
ViewModel:
private int? percentage;
public int? Percentage
{
get
{
return this.percentage;
}
set
{
if (this.Percentage == value)
{
return;
}
// Unset = 1
this.percentage = value ?? 1;
// Coerce to be between 1 and 100.
// Using the TextBox, a user may attempt setting a larger or smaller value.
if (this.Percentage < 1)
{
this.percentage = 1;
}
else if (this.Percentage > 100)
{
this.percentage = 100;
}
this.NotifyPropertyChanged("Percentage");
}
}
Maalesef bu kod .NET 4.0'da kırar (aynı kod basitçe TargetFramework'ı 4.0 olarak değiştirdi). Özellikle, ilk kez değeri zorladığımdan sonra, tamsayı değerleri girmeye devam ettiğim sürece (int türüne bağlandığım için) TextBox daha fazla zorlanan değeri göz ardı eder.
"123" girersem, 3'ten sonra "100" değerini görüyorum. Şimdi "4" girersem, ViewModel'deki ayarlayıcı 100'e zorladığı "1004" değerini alır. TextChanged olayı daha sonra patlar (ve gönderenin TextBox.Text'i "100" olur!), Ancak TextBox gösterir " 1004" . Eğer "5" girersem, setter "10045" değerini alır, vb.
Eğer bir "a" girersem, TextBox aniden doğru değeri gösterir, yani "100". Int taşmasına kadar sayı girmeye devam edersem de aynı durum oluşur.
Bunu nasıl düzeltebilirim? yerine PropertyChanged ait Açık xaml kullanılarak