Стилизация ошибки валидации в WPF DataGridCell

Я пытаюсь изменить способ отображения DataGridCell, если в нем есть ошибка. По умолчанию он имеет белый фон и красную рамку при обнаружении ошибки. Однако похоже, что мои попытки установить Validation.ErrorTemplate этого класса игнорируются, как и мои триггеры для свойства Validation.HasError. Весь код, необходимый для воспроизведения проблемы, находится ниже; Мне совершенно не удалось заставить WPF применять какие-либо стили к ячейке при ошибке. Кто-нибудь видит здесь проблему или предлагает возможное решение?

APP.XAML

<Application.Resources>
        <ControlTemplate x:Key="ErrorTemplate">
            <DockPanel>
                <TextBlock Text="Busted!"/>
                <AdornedElementPlaceholder/>
            </DockPanel>
        </ControlTemplate>
        <Style x:Key="{x:Type WpfToolkit:DataGridCell}" TargetType="{x:Type WpfToolkit:DataGridCell}">
            <Style.Setters>
                <Setter Property="Validation.ErrorTemplate" Value="{StaticResource ErrorTemplate}"/>
                <Setter Property="Background" Value="Green"/>
            </Style.Setters>
            <Style.Triggers>
                <Trigger Property="Validation.HasError" Value="True">
                    <Setter Property="Background" Value="Red"/>
                    <Setter Property="ToolTip" Value="Doh!"/>
                </Trigger>
            </Style.Triggers>

        </Style>
    </Application.Resources>

MainWindow.xaml

<Grid>

        <WpfToolkit:DataGrid ItemsSource="{Binding Path=MyItems, ValidatesOnDataErrors=True}" AutoGenerateColumns="False">
            <WpfToolkit:DataGrid.Columns>
                <WpfToolkit:DataGridTextColumn Header="Wheel Count" Binding="{Binding WheelCount, ValidatesOnDataErrors=True}"/>
                <WpfToolkit:DataGridTextColumn Header="Car Colour" Binding="{Binding Color, ValidatesOnDataErrors=True}"/>
            </WpfToolkit:DataGrid.Columns>
        </WpfToolkit:DataGrid>
    </Grid>

Класс, к которому привязывается, -

Car.cs

class Car : IDataErrorInfo, INotifyPropertyChanged
    {
        public Car(int numWheels, string Color)
        {
            _color = Color;
            _wheelCount = numWheels;
        }

        private string _color;
        public string Color
        {
            get
            {
                return _color;
            }
            set
            {
                _color = value;
                if (value.Length > 10)
                {
                    //Warning
                }
                if (value.Length > 20)
                {
                    //Error
                }
                PropChanged("Color");

            }
        }

        private int _wheelCount;
        public int WheelCount
        {
            get
            {
                return _wheelCount;
            }
            set
            {
                _wheelCount = value;
                if (value != 4)
                {
                    AddError("WheelCount", "There should be 4 wheels on the car!");
                }
                else
                    this.ClearError("WheelCount");
                PropChanged("WheelCount");

            }
        }

        public void AddError(string propName, string errorMessage)
        {
            if (myErrors.ContainsKey(propName))
                myErrors.Remove(propName);
            myErrors.Add(propName, errorMessage);
            PropChanged(propName);
            PropChanged("Error");
        }

        public void ClearError(string propName)
        {
            if (myErrors.ContainsKey(propName))
                myErrors.Remove(propName);
        }

        private Dictionary<string, string> myErrors = new Dictionary<string, string>();

        public string Error
        {
            get
            {
                StringBuilder myError = new StringBuilder("Errors");
                foreach (KeyValuePair<string,string> currentErr in myErrors)
                {
                    myError.AppendLine(currentErr.Key + ":" + currentErr.Value);
                }
                return myError.ToString();
            }
        }

        public string this[string columnName]
        {
            get
            {
                if (!myErrors.ContainsKey(columnName))
                    return null;
                else
                    return myErrors[columnName];
            }
        }

        public void PropChanged(string propName)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }

"ViewModel" для представления - CarVM:

CarVM.cs

 class CarVM
    {
        public CarVM()
        {
            for (int currentCar = 0; currentCar < 20; currentCar++)
            {
                myCars.Add(new Car(4, "Red"));
            }
            MyItems = (CollectionView)CollectionViewSource.GetDefaultView(myCars);
        }
        private List<Car> myCars = new List<Car>();
        public CollectionView MyItems
        {
            get;
            private set;
        }
    }

И код в окне очень простой:

MainWindow.Xaml.Cs

 public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new CarVM();
        }
    }
1
задан GWLlosa 30 September 2010 в 15:12
поделиться