2

私が達成したいのは、編集可能なコンボボックスに入力された新しいカテゴリ、または既存のコンボボックスのカテゴリのリストから選択されるカテゴリを検証できるようにすることです。

検証は、Text に入力された新しいテキストではなく、selectedItem に対してのみ機能します。ComboBox の Text プロパティに追加するとすぐに、ValidateOnDataErrors="True"新しいテキストの入力によるイベントが発生しません。カテゴリは、ID と名前を持つ単純なオブジェクトです。

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}" />

ビューモデル: ( : 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;
            }
4

1 に答える 1