<Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:local="clr-namespace:WpfApplication1" Title="Random Numbers Built to Order"> <Window.Resources> <ObjectDataProvider x:Key="nextRandomNumber" ObjectType="{x:Type sys:Random}" MethodName="Next"> <ObjectDataProvider.MethodParameters> <sys:Int32>0</sys:Int32> <sys:Int32>10</sys:Int32> </ObjectDataProvider.MethodParameters> </ObjectDataProvider> <local:StringToInt32Converter x:Key="numConverter" /> </Window.Resources> <StackPanel DataContext="{StaticResource nextRandomNumber}"> <Label>Min</Label> <TextBox Name="minTextBox" ToolTip="{Binding ElementName=minTextBox, Path=(Validation.Errors)[0].ErrorContent}"> <TextBox.Text> <Binding Path="MethodParameters[0]" BindsDirectlyToSource="True" Converter="{StaticResource numConverter}"> <Binding.ValidationRules> <local:IntegerValidator /> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox> <Label>Max</Label> <TextBox Name="maxTextBox" ToolTip="{Binding ElementName=maxTextBox, Path=(Validation.Errors)[0].ErrorContent}"> <TextBox.Text> <Binding Path="MethodParameters[1]" BindsDirectlyToSource="True" Converter="{StaticResource numConverter}"> <Binding.ValidationRules> <local:IntegerValidator /> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox> <Label>Random</Label> <TextBox Text="{Binding Mode=OneTime}" IsReadOnly="True" /> <Button Name="nextButton">Next</Button> </StackPanel> </Window> //File:Window.xaml.cs using System; using System.Collections.Generic; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; namespace WpfApplication1 { public partial class Window1 : System.Windows.Window { public Window1() { InitializeComponent(); nextButton.Click += new RoutedEventHandler(nextButton_Click); } void nextButton_Click(object sender, RoutedEventArgs e) { ((ObjectDataProvider)Resources["nextRandomNumber"]).Refresh(); } } public class StringToInt32Converter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return ((int)value).ToString(); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return int.Parse((string)value); } } public class IntegerValidator : ValidationRule { public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) { try { int.Parse((string)value); return ValidationResult.ValidResult; } catch( Exception ex ) { return new ValidationResult(false, ex.Message); } } } }