Ich schreibe eine echte NumericUpDown/Spinner
Kontrolle als Übung, um benutzerdefinierte Steuerelement Authoring zu lernen. Ich habe das meiste Verhalten, nach dem ich suche, einschließlich angemessenem Zwang. Einer meiner Tests hat jedoch einen Fehler aufgedeckt.Warum sieht meine Datenbindung den tatsächlichen Wert anstelle des erzwungenen Werts?
Meine Kontrolle hat 3 Abhängigkeitseigenschaften: Value
, MaximumValue
und MinimumValue
. Ich verwende Zwang, um sicherzustellen, dass Value
zwischen dem Minimum und dem Maximum einschließlich bleibt. Zum Beispiel:
Mein Test ist nur um sicherzustellen, dass die Datenbindung funktioniert, wie ich es erwarte. Ich habe eine Standard wpf Windows-Anwendung und warf in der folgenden XAML:
<Window x:Class="WpfApplication.MainWindow" x:Name="This"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:nud="clr-namespace:WpfCustomControlLibrary;assembly=WpfCustomControlLibrary"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<nud:NumericUpDown Value="{Binding ElementName=This, Path=NumberValue}"/>
<TextBox Grid.Row="1" Text="{Binding ElementName=This, Path=NumberValue, Mode=OneWay}" />
</Grid>
</Window>
mit sehr einfachen Code-Behind:
public partial class MainWindow : Window
{
public int NumberValue
{
get { return (int)GetValue(NumberValueProperty); }
set { SetCurrentValue(NumberValueProperty, value); }
}
// Using a DependencyProperty as the backing store for NumberValue. This enables animation, styling, binding, etc...
public static readonly DependencyProperty NumberValueProperty =
DependencyProperty.Register("NumberValue", typeof(int), typeof(MainWindow), new UIPropertyMetadata(0));
public MainWindow()
{
InitializeComponent();
}
}
(Ich bin das XAML für die Kontrolle der Darstellung weggelassen)
Jetzt Wenn ich das ausführe, sehe ich den Wert aus dem NumericUpDown
entsprechend in das Textfeld, aber wenn ich einen Wert außerhalb des Bereichs eintippe, wird der Wert außerhalb des Bereichs im Testtextfeld angezeigt, während NumericUpDown
den korrekten Wert anzeigt.
Wie sollen die erzwungenen Werte wirken? Es ist gut, dass es in der UI erzwungen wird, aber ich erwartete, dass der erzwungene Wert auch durch die Datenbindung läuft.
Scheint, dass die Bindung Val nicht unterstützt. Hast du den Diff-Modus in TextBox ausprobiert? –