Неожиданная красная граница (ошибка проверки) в DataGrid при выборе пустой строки
Когда я выбираю (щелчком или по клавиатуре) пустую строку в моем DataGrid (когда я хочу добавить новую строку), возникает непредвиденная ошибка проверки (но без исключения) - граница datagrid изменяется на красный цвет, так как вы можно увидеть на изображении ниже. Когда я нажимаю второй раз на пустой строке, красная рамка исчезает. Все остальное отлично работает, добавляется новая строка. Кроме того, у меня нет правил проверки. И когда я делаю строку с пустым текстом, значение действительно.
Я не хочу этого поведения и этой красной границы, кто-нибудь знает, почему это происходит и как это исправить? Почему и где не выполняется какая-либо проверка?
![enter image description here]()
Ниже я добавляю исходный код:
Определение DataGrid в xaml:
<DataGrid IsSynchronizedWithCurrentItem="True" DisplayMemberPath="Name"
ItemsSource="{Binding Path=ConfigFiles}" SelectedItem="{Binding Path=SelectedConfigFile}"
Grid.Column="1" Height="87" Margin="0,26,11,32" Style="{DynamicResource DataGridStyle}">
<DataGrid.Columns>
<DataGridTextColumn Width="1*" Binding="{Binding Name}" />
</DataGrid.Columns>
</DataGrid>
Моя часть ViewModel:
public class ManageModulesVM : BaseVM // Implements INotifyPropertyChanged
{
// ...
public ObservableCollection<ConfigFile> ConfigFiles
{
get { return selectedModule == null ? null : selectedModule.ConfigFiles; }
set
{
selectedModule.ConfigFiles = value;
OnPropertyChanged(() => ConfigFiles);
}
}
public ConfigFile SelectedConfigFile
{
get { return selectedModule == null ? null : selectedModule.SelectedConfigFile; }
set
{
if (value != null)
{
selectedModule.SelectedConfigFile = value;
}
OnPropertyChanged(() => SelectedConfigFile);
OnPropertyChanged(() => Parameters);
}
}
// ...
}
Класс ConfigFile:
public class ConfigFile
{
public string Name { get; set; }
public IList<Parameter> Parameters { get; set; }
public ConfigFile() { Name = ""; Parameters = new List<Parameter>(); }
}
Изменить:
После дальнейшего исследования я знаю, что SelectedItem Binding вызывает проблемы (когда я удаляю это привязку, ошибка проверки перестает появляться), но я до сих пор не знаю, почему и как это исправить.
Ответы
Ответ 1
Я нашел свое решение этого вопроса. Я написал конвертер значений и привязал его к привязке:
(SelectedItem="{Binding Path=SelectedConfigFile,Converter={StaticResource configFileConverter}}")
Класс преобразователя:
namespace Converters
{
public class SelectedConfigFileConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if(value is ConfigFile)
return value;
return null;
}
}
}
Определите ресурс в файле resources.xaml
(или в любом другом месте):
<ResourceDictionary (...) xmlns:conv="clr-namespace:Converters" >
<conv:SelectedConfigFileConverter x:Key="configFileConverter" />
</ResourceDictionary>
Преимущество этого решения заключается в том, что тип свойства SelectedConfigFile
не был изменен (на общий тип object
), поэтому он все еще строго типизирован.
Ответ 2
Чтобы узнать причину, при нажатии новой строки DataGrid в режиме отладки, просмотрите окно отладки. Есть первые сообщения об исключениях, которые дадут вам представление о том, почему возникла ваша проблема.
Да, проблема связана с типом. Вам нужно изменить тип SelectedItem на тип объекта, как показано ниже.
public class ManageModulesVM : BaseVM // Implements INotifyPropertyChanged
{
// ...
public object SelectedConfigFile
{
get { return selectedModule == null ? null : selectedModule.SelectedConfigFile; }
set
{
if (value != null)
{
selectedModule.SelectedConfigFile = value;
}
OnPropertyChanged(() => SelectedConfigFile);
OnPropertyChanged(() => Parameters);
}
}
// ...
}
Ответ 3
Вы можете просто добавить эту строку в свой DataGrid:
<DataGrid Validation.ErrorTemplate="{x:Null}" />
Ответ 4
Здесь универсальный конвертер, который вы можете использовать для любого DataGrid, привязывая любой элемент:
public class DataGridItemConverter : MarkupExtension, IValueConverter
{
static DataGridItemConverter converter;
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return (value != null && value.GetType() == targetType) ? value : null;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
if (converter == null)
converter = new DataGridItemConverter();
return converter;
}
}
Поскольку он реализует MarkupExtension, вам даже не нужно определять статический ресурс, вы можете просто ссылаться на него следующим образом:
SelectedItem="{Binding SelectedThing,Converter={conv:DataGridItemConverter}}"
Ответ 5
Вы можете просто добавить эту строку в свой DataGrid:
<DataGrid Validation.ErrorTemplate="{x:Null}" />
Это решит проблему