DataGridのコピー機能が、日本語限定でバグってる(弐)

前回からの続きで再開。日本語を含む文字列をコピーする際の処理を、自前のロジックに置き換える必要がある。
DataGridクラスを継承する場合は、OnExecutedCopyをoverrideする。

public class DataGridEx : System.Windows.Controls.DataGrid {

/// <summary>
/// ApplicationCommands.Copy用メソッド
/// </summary>
/// <param name="args">イベントデータ/param>
protected override void OnExecutedCopy(ExecutedRoutedEventArgs args) {
  //コピー処理を実装する。
return;
}
}

継承クラスを作りたくない時は、添付プロパティで実装する。仕事では、こっちを採用している。

public static class WpfHelper {

/// <summary>
/// カスタムコピー処理を使用するかどうかを取得します。
/// </summary>
/// <param name="obj">対象オブジェクト</param>
/// <returns>カスタムコピー処理を使用するかどうか</returns>
public static bool? GetUseCustomCopyCells(DependencyObject obj) {
return (bool)obj.GetValue(UseCustomCopyCellsProperty);
}

/// <summary>
/// カスタムコピー処理を使用するかどうかを設定します。
/// </summary>
/// <param name="obj">対象オブジェクト</param>
/// <param name="value">カスタムコピー処理を使用するかどうか</param>
public static void SetUseCustomCopyCells(DependencyObject obj, bool? value) {
obj.SetValue(UseCustomCopyCellsProperty, value);
}

/// <summary>カスタムコピー処理を使用するかどうか</summary>
/// <AttachedPropertyComments>
/// <summary>
/// カスタムコピー処理を使用するかどうか
/// </summary>
/// <value>The default value is null</value>
/// </AttachedPropertyComments>
public static readonly DependencyProperty UseCustomCopyCellsProperty =
DependencyProperty.RegisterAttached("UseCustomCopyCells",
typeof(bool?),
typeof(WpfHelper),
new FrameworkPropertyMetadata(null,
FrameworkPropertyMetadataOptions.SubPropertiesDoNotAffectRender,
OnUseCustomCopyCellsPropertyChanged));
}
bool?型にしているのは、ウィンドウ終了時にfalseに設定して、終了処理を行う為。
次に、プロパティ変更イベントハンドラを実装する。

/// <summary>
/// UseCustomCopyCellsプロパティ値変更イベントハンドラ
/// </summary>
/// <param name="dpObj">イベントソース</param>
/// <param name="e">イベントデータ</param>
private static void OnUseCustomCopyCellsPropertyChanged(
DependencyObject dpObj, DependencyPropertyChangedEventArgs e) {

var dataGrid = dpObj as DataGrid;

if (e.Oldvalue != null) {
var binding = WpfHelper.GetCopyCommandBinding(dataGrid, copyBinding);

if (binding != null) {
dataGrid.CommandBindings.Remove(binding);
binding = null;
}
}

if (e.NewValue != null && ((bool?)e.NewValue).GetValueOrDefault()) {
var copyBinding = new CommandBinding(ApplicationCommands.Copy,
ExecuteCopyingData, CanExecuteCopyingData);
//コピーコマンドを自前で実装する
dataGrid.CommandBindings.Add(copyBinding);
WpfHelper.SetCopyCommandBinding(dataGrid, copyBinding);
}
return;
}
生成したCommandBindingインスタンスは、ウィンドウ終了時に削除する必要がある。削除するためには、生成したインスタンスをRemoveメソッドの引数として設定しなければならないので、それ用の添付プロパティも定義する(本稿では、定義部分を割愛する)。
続く。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m