I want to create a custom text box with an attached property for a Windows Store application. I follow this decision . Now it uses a hard-coded value as the value of the property, but I want to set the value using binding, but it does not work. I tried to search a lot, but did not help me in the decision.
Exclusion details look like this
An exception like "Windows.UI.Xaml.Markup.XamlParseException" occurred in CustomTextBox.exe, but was not processed in the user code
WinRT Info: Failed to set property 'CustomTextBox.Input.Type'.
MainPage.xaml
<TextBox x:Name="txt" local:Input.Type="{Binding SelectedTextboxInputType}" Height="30" Width="1000" /> <ComboBox x:Name="cmb" ItemsSource="{Binding TextboxInputTypeList}" SelectedItem="{Binding SelectedTextboxInputType}" Height="30" Width="200" Margin="451,211,715,527" />
MainPage.xaml.cs
public sealed partial class MainPage : Page { public MainPage() { this.InitializeComponent(); DataContext = new ViewModel(); } }
Input.cs
//InputType is enum public static InputType GetType(DependencyObject obj) { return (InputType)obj.GetValue(TypeProperty); } public static void SetType(DependencyObject obj, InputType value) { obj.SetValue(TypeProperty, value); } public static readonly DependencyProperty TypeProperty = DependencyProperty.RegisterAttached("Type", typeof(InputType), typeof(TextBox), new PropertyMetadata(default(InputType), OnTypeChanged)); private static void OnTypeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (e.NewValue is InputType) { var textBox = (TextBox)d; var Type = (InputType)e.NewValue; if (Type == InputType.Email || Type == InputType.URL) { textBox.LostFocus += OnLostFocus; } else { textBox.TextChanged += OnTextChanged; } } }
ViewModel.cs
public class ViewModel : BindableBase { public ViewModel() { TextboxInputTypeList = Enum.GetValues(typeof(InputType)).Cast<InputType>(); } private InputType _SelectedTextboxInputType = InputType.Currency; public InputType SelectedTextboxInputType { get { return _SelectedTextboxInputType; } set { this.SetProperty(ref this._SelectedTextboxInputType, value); } } private IEnumerable<InputType> _TextboxInputTypeList; public IEnumerable<InputType> TextboxInputTypeList { get { return _TextboxInputTypeList; } set { this.SetProperty(ref this._TextboxInputTypeList, value); } } }