WPF / C # IDataErrorInfo не стреляет - PullRequest
1 голос
/ 24 ноября 2010

У меня есть поле со списком и кнопка на моей форме.В выпадающем списке есть категории.Я хочу разрешить / запретить ожидание, если это «системная категория» на основе логического значения.

Вот мой xaml:

<Window.Resources>
    <Style TargetType="{x:Type ComboBox}">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="true">
                <Setter Property="ToolTip"
                Value="{Binding RelativeSource={RelativeSource Self}, 
                       Path=(Validation.Errors)[0].ErrorContent}"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

Это панель стека с двумя элементами управленияв них:

                <StackPanel Grid.Column="1" Grid.Row="1">
                    <Label Content="Delete Category" Height="28"/>
                    <ComboBox x:Name="comboBox_DeleteCategory" 
                              Grid.Row="1" 
                              Height="29"                                  
                              ItemsSource="{Binding Path=CategorySelected.Items, ValidatesOnDataErrors=true, NotifyOnValidationError=true}"
                              SelectedItem="{Binding Path=CategorySelected.SelectedItem ,ValidatesOnDataErrors=True, NotifyOnValidationError=true}" 
                              DisplayMemberPath="Name"/>
                    <Button Content="Delete" Height="25" Margin="0,5,0,0" HorizontalAlignment="Right" Width="103.307" Command="{Binding DeleteCommand}"/>
                </StackPanel>

Я пытаюсь заставить выпадающий список отображать всплывающую подсказку, если определено, что это системная категория.

Команда DeleteCommand работает нормально, поэтому у меня нетпроблемы с отключением кнопки, когда я получаю удар по категории системы.

Это мой код для отображения всплывающей подсказки:

#region IDataErrorInfo Members

public string Error { get; set; }

public string this[string columnName]
{
  get
  {
    Error = "";
    switch (columnName)
    {
      case "comboBox_DeleteCategory":
        if (CategorySelected.SelectedItem != null && CategorySelected.SelectedItem.IsInternal)
        {
            Error = CategorySelected.SelectedItem.Name + " is an system category and cannot be deleted.";
            break;
        }
        break;

    }

    return Error;
  }
}

#endregion

Есть предложения?

Спасибо

Eroc

1 Ответ

3 голосов
/ 25 ноября 2010

Индексатор ( открытая строка this [string columnName] ) вызывается с именем свойства, которое было изменено последним обновлением привязки.То есть фильтрация для comboBox_DeleteCategory (имя элемента управления) здесь не поможет.Необходимо отфильтровать свойство, которое было обновлено привязкой элемента управления, и определить, находится ли оно в ожидаемом состоянии.Вы можете поместить точку останова в индексатор и посмотреть значение columnName.Более того, свойство Error вообще не используется WPF.Таким образом, нет необходимости устанавливать его.Простой пример:

public class Contact : IDataErrorInfo, INotifyPropertyChanged
{
     private string firstName;
     public string FirstName
     {
         // ... set/get with prop changed support
     }

     #region IDataErrorInfo Members

     public string Error
     {
         // NOT USED BY WPF
         get { throw new NotImplementedException(); }
     }

     public string this[string columnName]
     {
        get 
        {
            // null or string.Empty won't raise a validation error.
            string result = null;

            if( columnName == "FirstName" )
            {
                if (String.IsNullOrEmpty(FirstName))
                     result = "A first name please...";
                else if (FirstName.Length < 5)
                     result = "More than 5 chars please...";
             }

            return result;
    }
}

#endregion

}

...