Я уже давно борюсь с этим.У меня есть макет Master / Details в моем приложении, и, как и многие другие, я столкнулся с проблемой потери DataGrid при его отключении.По сути, после выбора элемента из списка для заполнения ряда полей пользователь нажимает кнопку «Редактировать», которая отключает DataGrid и включает все поля формы.Нажатие кнопки «Сохранить» вернет эти действия после сохранения данных ... Довольно прямолинейно.
Я работаю на Windows 7 с VS 2010 в .Net Framework 4.
Что я пробовал:
1) На основании этого поста , яЯ пытался использовать DataGrid в версии WPF Toolkit, выпущенной в июне 2009 года, но у меня была такая же реакция.
2) На основе этого отчета об ошибке WPF CodePlex я попытался создать пользовательский элемент управленияоснованный на DataGrid и переопределить вызов OnIsEnabledChanged, чтобы удалить вызов «UnselectAllCells», но без примера кода, я даже не могу заставить его срабатывать один раз.Я попытался:
public class FormMainDataGrid : DataGrid
{
static FormMainDataGrid()
{
IsEnabledProperty.OverrideMetadata(typeof(FormMainDataGrid), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnIsEnabledChanged)));
}
public FormMainDataGrid() : base() { }
private static void OnIsEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
d.CoerceValue(CanUserAddRowsProperty);
d.CoerceValue(CanUserDeleteRowsProperty);
//this was added in new version !!!
/*
if (!(bool)(e.NewValue))
{
((DataGrid)d).UnselectAllCells();
}
*/
// Many commands use IsEnabled to determine if they are enabled or not
CommandManager.InvalidateRequerySuggested();
}
}
, но это все равно отменяет выбор текущей выбранной строки, как только я отключаю DataGrid.Я пытался интерпретировать последние комментарии (в отчете об ошибках Codeplex) следующим образом:
public class FormMainDataGrid : DataGrid
{
static FormMainDataGrid()
{
}
public static void OverrideStuff()
{
IsEnabledProperty.OverrideMetadata(typeof(FormMainDataGrid), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnIsEnabledChanged)));
}
public FormMainDataGrid() : base() { }
private static void OnIsEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
d.CoerceValue(CanUserAddRowsProperty);
d.CoerceValue(CanUserDeleteRowsProperty);
//this was added in new version !!!
/*
if (!(bool)(e.NewValue))
{
((DataGrid)d).UnselectAllCells();
}
*/
// Many commands use IsEnabled to determine if they are enabled or not
CommandManager.InvalidateRequerySuggested();
}
}
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
FormMainDataGrid.OverrideStuff();
base.OnStartup(e);
}
}
, но это даже не запускает модифицированную версию метода.
Во-первых, am-Я иду правильным путем для этого?Учитывая, что отмена выбора вызвана этим методом, могу ли я полностью заменить внутренний вызов OnIsEnabledChanged для моего собственного метода?Есть ли другой способ, которым я мог бы заняться этой проблемой?Или, более конкретно, как я могу остановить вызов базовой версии этого метода, поскольку он не является переопределением, поэтому я не могу 'not' вызвать base.OnIsEnabledChanged
?
Большое спасибо!