2014-11-03 3 views
1

Hie. В настоящее время у меня есть прикрепленное свойство, которое я использую для получения информации из TextBoxes и, если нужно, изменяю его. Однако он работает только с текстовыми полями, что означает, что с ним нельзя использовать элементы управления пользователями, такие как ComboBoxes и DatePickers. Я не совсем уверен, где его изменить, чтобы заставить его работать с ними. Ниже приведен класс.Как добавить прикрепленное свойство в поле со списком?

public class TextBoxProperties 
{ 
    public static readonly DependencyProperty IsTextFormattedProperty = DependencyProperty.RegisterAttached("IsTextFormatted", typeof(bool), typeof(TextBoxProperties), new UIPropertyMetadata(default(bool), OnIsTextFormattedChanged)); 

    public static bool GetIsTextFormatted(DependencyObject dependencyObject) 
    { 
     return (bool)dependencyObject.GetValue(IsTextFormattedProperty); 
    } 

    public static void SetIsTextFormatted(DependencyObject dependencyObject, bool value) 
    { 
     dependencyObject.SetValue(IsTextFormattedProperty, value); 
    } 

    public static void OnIsTextFormattedChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) 
    { 
     TextBox textBox = dependencyObject as TextBox; 
     ComboBox comboBox = dependencyObject as ComboBox; 

     // This will work fine... 
     if (textBox.Name == "firstNameTextBox") 
     { 
      bool newIsTextFormattedValue = (bool)dependencyPropertyChangedEventArgs.NewValue; 
      if (newIsTextFormattedValue) textBox.TextChanged += MyTextBoxChangedHandler; 
      else textBox.TextChanged -= MyTextBoxChangedHandler; 
     } 

     // This on the other hand will not 
     if (comboBox.Name == "genderTextBox") 
     { 
      bool newIsTextFormattedValue = (bool)dependencyPropertyChangedEventArgs.NewValue; 
      if (newIsTextFormattedValue) textBox.TextChanged += MyComboBoxChangedHandler; 
      else textBox.TextChanged -= MyComboBoxChangedHandler; 
     } 
    } 

    public static void MyTextBoxChangedHandler(object sender, TextChangedEventArgs e) 
    { 
     // Do what ever needs to be done with text... 
    } 

    public static void MyComboBoxChangedHandler(object sender, TextChangedEventArgs e) 
    { 
     // Do what ever needs to be done with text... 
    } 

При его использовании я просто поместить это в XAML отображения вида:

<TextBox TextBoxProperties:IsFormatted="True" ... /> 
<ComboBox TextBoxProperties:IsFormatted="True" ... /> 

Как всегда когда я когда-либо добавить вложенное свойство к COMBOBOX, я получаю «ссылка на объект не указывает на экземпляр ошибки объекта в окне ошибки. Если я запустил приложение, он просто сбой с первым шансом, показывающим одно и то же сообщение.

Любая подсказка о том, как заставить его работать?

+0

если (! COMBOBOX = нуль) и [Что такое NullReferenceException и как это исправить?] (HTTP: // StackOverflow .com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) – Mark

+0

@Offer Как один объект может быть как 'ComboBox', так и' TextBox'? Вы должны проверить, не являются ли 'textBox' или' comboBox', и если 'comboBox' не является нулевым, то' textBox' будет – dkozl

+0

, аргумент 'dependencyObject' может быть только одного типа, поэтому вам нужно сначала проверить тип, если кастинг с использованием 'as', убедитесь, что результат не равен нулю. –

ответ

1

Вы должны проверить, если textbo имеет нулевое значение, а также выпадающий:

TextBox textBox = dependencyObject as TextBox; 
    ComboBox comboBox = dependencyObject as ComboBox; 

    if (textBox != null && textBox.Name == "firstNameTextBox") 
    { 
     bool newIsTextFormattedValue = (bool)dependencyPropertyChangedEventArgs.NewValue; 
     if (newIsTextFormattedValue) textBox.TextChanged += MyTextChangedHandler; 
     else textBox.TextChanged -= MyTextChangedHandler; 
    } 

    if (comboBox != null && comboBox.Name == "genderTextBox") 
    { 
     bool newIsTextFormattedValue = (bool)dependencyPropertyChangedEventArgs.NewValue; 
     if (newIsTextFormattedValue) comboBox.SomeEvent += MyComboBoxChangedHandler; 
     else comboBox.SomeEvent -= MyComboBoxChangedHandler; 
    } 
+0

, это все равно вызовет исключение ссылки, потому что если это 'ComboBox', то' textBox', на который вы ссылаетесь во втором, если будет, будет null. Это не может быть как 'ComboBox', так и' TextBox' – dkozl

+0

, это не должно приводить к исключению ссылочной ссылки, перед тем как получить доступ к ней, каждый из них проверяется на значение null. – ShayD

+0

Будет. Во-вторых, если 'ComboBox',' textBox.TextChanged + = MyComboBoxChangedHandler' или 'textBox.TextChanged - = MyComboBoxChangedHandler' и' textBox' в этом случае будет 0 – dkozl

Смежные вопросы