2013-04-11 5 views
0

Что я хочу сделать, так это иметь возможность проверять новую категорию, набранную в редактируемое поле со списком, или для одного из выбранных списков категорий combobox'es.WPF Редактируемая проверка ComboBox

Валидация работает только для выбранного объекта, а не для ввода нового текста. Как только я добавлю значение ValidateOnDataErrors="True" в свойство ComboBox'es Text, события ввода нового текста не запускаются. Категория - это простой объект с идентификатором и именем.

XAML:

<Window.Resources> 
    <ControlTemplate x:Key="ValidationErrorTamplate"> 
     <Border BorderBrush="DodgerBlue" BorderThickness="0.75"> 
      <AdornedElementPlaceholder /> 
     </Border> 
    </ControlTemplate> 
    <Style x:Key="ElementInError" TargetType="{x:Type FrameworkElement}"> 
     <Style.Triggers> 
      <Trigger Property="Validation.HasError" Value="True"> 
       <Setter Property="ToolTip" Value="{Binding (Validation.Errors)[0].ErrorContent, RelativeSource={x:Static RelativeSource.Self}}" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 

<ComboBox Name="CbCategory" 
      DisplayMemberPath="Name" 
      IsEditable="True" 
      ItemsSource="{Binding Categories}" 
      SelectedItem="{Binding SelectedCategory, 
           UpdateSourceTrigger=PropertyChanged, 
           ValidatesOnDataErrors=True}" 
      Style="{StaticResource ElementInError}" 
      Text="{Binding NewCategory.Name, 
         UpdateSourceTrigger=PropertyChanged, 
         ValidatesOnDataErrors=True}" 
      Validation.ErrorTemplate="{StaticResource ValidationErrorTamplate}" /> 

ViewModel: (: IDataErrorInfo)

private Category _newCategory; 
    private Category _selectedCategory; 

    public ExpenseCategory SelectedCategory 
    { 
     get { return _selectedCategory; } 
     set 
      { 
       if (Equals(_selectedCategory, value)) return; 
       _selectedCategory = value; 
       SendPropertyChanged("SelectedCategory"); 
      } 
    } 
    public ExpenseCategory NewExpenseCategory 
    { 
     get { return _newExpenseCategory ?? (_newExpenseCategory = new ExpenseCategory()); } 
      set 
      { 
       if (Equals(_newExpenseCategory, value)) return; 
       _newExpenseCategory = value; 
       SendPropertyChanged("NewExpenseCategory"); 
      } 
     } 

public string this[string propertyName] 
     { 
      get 
      { 
       switch (propertyName) 
       { 
        case "SelectedExpenseCategory": 
        case "NewExpenseCategory": 
         { 
          if ((SelectedCategory == null) || (NewCategory == null) 
          { 
           return "Category must be selected or entered"; 
          } 
         } 
         break; 
       } 
       return string.Empty; 
      } 

ответ

1

Понял работает, это может быть не превосходным способом, но он получает работу.

Что я в основном сделал, я изменил NewCategory как строку, а не объект типа Category. Когда пользователь заполняет новое значение в combobox, он инициирует новую SelectedCategory на основе значения, переданного в конструктор NewCategory. Это не работает, если я сохраняю категорию NewCategory категории объектов.

+0

Я всегда получаю нулевую ошибку, когда пытаюсь ввести новое значение в свой список со списком для элемента «Текущий». Позаботьтесь о том, чтобы предоставить код текущего кода тому, что у вас есть? Это не соответствует моей линии, которая эквивалентна вашей (SelectedExpenseCategory.Name.Length == 0) – JTester