2016-07-21 6 views
0

データグリッドがあります。データグリッドは、Webサービスから取得したデータによってプログラムによって作成されます。データグリッドの最後の列にはチェックボックスがあり、マップ上の各行の値を表示することができます。WPF DataGrid - バインドせずにテンプレート列のチェックボックスを設定するには?

DataGridTemplateColumn column = new DataGridTemplateColumn(); 
column.Header = "Show on map"; 
DataTemplate dt = new DataTemplate(); 
FrameworkElementFactory checkBoxFactory = new FrameworkElementFactory(typeof(CheckBox)); 
checkBoxFactory.AddHandler(CheckBox.ClickEvent, new RoutedEventHandler(CheckBoxClicked), true); 
dt.VisualTree = checkBoxFactory; 
column.CellTemplate = dt; 
DataGrid.Columns.Add(column); 

ユーザがチェックボックスのいずれかをクリックすると、CheckBoxClicked方法は、(既に述べたように)呼び出され、地図上のアイコンとして対応する行の値を表示する:カラムは、このようなテンプレートのカラムを使用して作成され。これは非常にうまくいく。しかしながら、ユーザは、データグリッドを含むウィンドウを閉じることができるが、マップは、表示されたアイコンとともに画面上にとどまる。

ここで、ユーザーがデータグリッドを使用してウィンドウを開くと、既に表示されているアイコンに従って、チェックボックスを事前に選択したいと思います。チェックボックスにはバインディングがないので、アイコンと一致させることができません。 これはどのように行うことができますか?プログラムで事前に選択する方法はありますか?またはバインディングを作成する方法はまだありますか?

+0

XAMLを使用してUIを設定してください。 – Hosch250

+1

これはしばらくしていませんが、WinFormsスタイルと同様に、設定できる各チェックボックスに 'IsChecked'プロパティがあるはずです。それ以外の場合は、XAMLを使用してUIを設定し、バインディングを簡単に使用することをお勧めします。 – Hosch250

+0

まあ、ありがとう。しかし、コンテンツは非常に動的であり、XAMLで設定することはできません。 –

答えて

0

最後に、解決策を見つけました。 Hosch250sのコメントは私に正しい軌道に導いてくれます(コメントをどのようにアップvoteできますか?)。答えはbinding in codeです。

プログラムでチェックボックスの状態を設定する最も簡単な方法は、このバインディングを作成することです:

Binding binding = new Binding("IsChecked"); 
binding.Mode = BindingMode.OneWay; 
binding.Source = this; 
checkBoxFactory.SetBinding(CheckBox.IsCheckedProperty, binding); 

そして、現在のコンテキストでプロパティを実装:

public bool IsChecked { 
    get { 
     return doWhateverToFindOutIfChecked(); 
    } 
} 
0

最初のアプローチ(メソッドで私の答えを参照してください拘束力のあるもの)は単純であり、前向きであった。しかし、バインディングがどの行に対して呼び出されるかは、実際には決めることができません。私はそれを以下のように変更しました:

DataGridTemplateColumnの代わりにDataGridCheckBoxColumnを使用しています。私のデータは動的に行に格納され、ListCollectionViewを使用してItemsSourceプロパティにバインドされます。チェックボックス列に必要なブール値は、行値に動的に挿入されます。私のデータグリッドは読み取り専用であり、選択単位はセルです。これらのプロパティを設定すると、私はMouseUpイベントを使ってマウスのクリックを検出できます。ハンドラメソッド内で、クリックがチェックボックスセルに属するかどうかを確認します。もしそうなら、私は行の値に対応するブール値を変更し、Items.refresh()を呼び出します。

関連する問題