मैं कस्टम नियंत्रण संलेखन सीखने के लिए एक अभ्यास के रूप में वास्तविक NumericUpDown/Spinner
नियंत्रण लिख रहा हूं। मुझे उचित व्यवहार सहित अधिकांश व्यवहार मिल गया है। हालांकि, मेरे परीक्षणों में से एक ने एक दोष प्रकट किया है।मेरे डेटा बाइंडिंग को मजबूर मूल्य के बजाय वास्तविक मूल्य क्यों दिखता है?
मेरे नियंत्रण में 3 निर्भरता गुण हैं: Value
, MaximumValue
, और MinimumValue
। मैं यह सुनिश्चित करने के लिए जबरदस्ती का उपयोग करता हूं कि Value
न्यूनतम और अधिकतम, समावेशी के बीच बनी हुई है। उदा।
// In NumericUpDown.cs
public static readonly DependencyProperty ValueProperty =
DependencyProperty.Register("Value", typeof(int), typeof(NumericUpDown),
new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault | FrameworkPropertyMetadataOptions.Journal, HandleValueChanged, HandleCoerceValue));
[Localizability(LocalizationCategory.Text)]
public int Value
{
get { return (int)this.GetValue(ValueProperty); }
set { this.SetCurrentValue(ValueProperty, value); }
}
private static object HandleCoerceValue(DependencyObject d, object baseValue)
{
NumericUpDown o = (NumericUpDown)d;
var v = (int)baseValue;
if (v < o.MinimumValue) v = o.MinimumValue;
if (v > o.MaximumValue) v = o.MaximumValue;
return v;
}
मेरा परीक्षण यह सुनिश्चित करने के लिए है कि डेटा बाध्यकारी काम करता है कि मैं कैसे उम्मीद करता हूं। मैं खिड़कियों आवेदन WPF एक डिफ़ॉल्ट बनाया है और निम्नलिखित XAML में फेंक दिया: बहुत ही सरल codebehind साथ
<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>
:
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();
}
}
(मैं नियंत्रण की प्रस्तुति के लिए XAML को छोड़ते हुए हूँ)
अब अगर मैं इसे चलाता हूं तो मुझे NumericUpDown
से मूल्य को टेक्स्टबॉक्स में उचित रूप से प्रतिबिंबित किया गया है, लेकिन यदि मैं श्रेणी मान से बाहर एक मान टाइप करता हूं तो श्रेणी टेक्स्टबॉक्स में प्रदर्शित होता है जबकि NumericUpDown
सही मान दिखाता है।
क्या यह अनुमानित मूल्यों को कार्य करना चाहिए? यह अच्छा है कि यह यूई में घुमाया गया है, लेकिन मुझे उम्मीद है कि coerced मूल्य डेटाबेस के माध्यम से भी चलाने के लिए।
लगता है बाध्यकारी कंसियरिंग वैल का समर्थन नहीं करता है। क्या आपने टेक्स्टबॉक्स में diff मोड की कोशिश की है? –