私はしばらくの間これを苦労しています。私は自分のアプリケーションにMaster/Detailsレイアウトを持っていて、他の多くのように、DataGridが無効にしたときにその選択を失うという問題に直面しています。 Essencialyは、リストから要素を選択して一連のフィールドを設定した後、「編集」を押すと、DataGridが無効になり、すべてのフォームのフィールドが有効になります。 「保存」ボタンを押すと、データを保存した後にこれらのアクションが元に戻ります。私は、私が試してみました何の.NET Framework 4にVS 2010でWPF DataGrid - 無効にすると選択を保持する
を研究開発をWindows 7で午前
:
1)this postに基づいて、私は2009年6月版でのDataGridを使用しようとしましたWPF Toolkit、しかし私は同じ反応を持っていました。
2)this WPF CodePlex bug reportに基づいて、私はDataGridに基づいてカスタムコントロールを作成し、 "UnselectAllCells"への呼び出しを削除するためにOnIsEnabledChanged呼び出しをオーバーライドしようとしましたが、コード例がなくても、一度。私が試してみました:
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();
}
}
が、これはまだのようにすぐに私はデータグリッドを無効にすると、現在選択されている行を選択解除します。私はこのような(CodePlexにバグレポートの)最後のコメントをinterpreteしようとしている:
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);
}
}
それはさえ方法の修正バージョンを発生しません。
まず、私はこれのために正しい道を進んでいますか? Deselectionがこのメソッドによって引き起こされたことを考慮して、自分のメソッドのために内部コールを 'OnIsEnabledChanged'に完全に置き換えることはできますか? この問題に取り組むことができる別の方法はありますか? さらに具体的には、オーバーライドではないので、このメソッドのベースバージョンへの呼び出しを停止するにはどうすればいいですか?つまり、base.OnIsEnabledChanged
を呼び出すことはできませんか?
ありがとう!
たTHX戦士。オーバーレイの問題は、DataGrid Focusable = False、AllowKeyboardFocus = Falseを設定しても、ユーザーは選択したままで遊ぶことができるということです(何らかの理由でフォーカスを次のDataGridにヒットし、実際にスクロールを開始するまでコントロールします)。行の詳細パターンはもっと奨励されていますが、私はUIデザイナーではないので、このようなデザインの制限は本当にデザイナーを幸せにしません! ;-) – JFTxJ
IsHitTestVisible = Falseに設定してみてください。ユーザーはそれに影響を与えてはなりません。 – CodeWarrior