DataGridの現在のセル情報を取得する

DataGrid上のクリックされたセルは、「現在のセル」という扱いで、CurrentCellというプロパティに設定されている。
CurrentCellというプロパティは、DataGridCellクラスそのものではなく、DataGridCellInfoという構造体である。
DataGridCellInfo
回りくどい感じがしないでもないが、このほうが都合が良いんだろう。
というわけで、ちょっと試してみる。

<Window x:Class="TawamureDays.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:local="clr-namespace:TawamureDays"
Title="MainWindow" Height="213" Width="385"
local:WindowBehavior.UseMessageCommand="True"
local:FrameworkElementBehavior.OnLoadedCommand="{Binding LoadedCommand}">
<DockPanel>
<StackPanel DockPanel.Dock="Bottom" Orientation="Vertical"
DataContext="{Binding CurrentCell, ElementName=PeoplesList}">
<TextBlock>Column:<TextBlock Text="{Binding Column.Header}"/></TextBlock>
<TextBlock>IsValid:<TextBlock Text="{Binding IsValid}"/></TextBlock>
<TextBlock>Item:<TextBlock Text="{Binding Item}"/></TextBlock>
<TextBox MinWidth="100" Text="Focusをはずす為のTextBox" IsReadOnly="True"/>
</StackPanel>
<DataGrid Name="PeoplesList"
AutoGenerateColumns="False"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Standard"
CanUserAddRows="False"
CanUserDeleteRows="False"
SelectionMode="Extended"
SelectionUnit="CellOrRowHeader"
ItemsSource="{Binding PersonsList}"
AlternatingRowBackground="AliceBlue">
<DataGrid.Columns>
<DataGridCheckBoxColumn IsReadOnly="False"
local:DataGridExtender.ColumnId="ColIsChecked"
/>
<DataGridTextColumn IsReadOnly="True"
Header="名前"
local:DataGridExtender.ColumnId="ColFirstName"
Binding="{Binding FirstName}"
Width="1*"
/>
<DataGridTextColumn IsReadOnly="True"
Header="苗字"
local:DataGridExtender.ColumnId="ColSecondName"
Binding="{Binding SecondName}"
Width="2*"
/>
<local:DataGridTextExColumn IsReadOnly="False"
Header="年齢"
local:DataGridExtender.ColumnId="ColAge2"
Binding="{Binding Age}"
Width="SizeToHeader"
HorizontalAlignment="Right"
/>
<DataGridTemplateColumn Header="誕生日" Width="*"
local:DataGridExtender.ColumnId="ColBirthday"
SortMemberPath="Birthday">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Birthday,
Mode=OneWay,
StringFormat=yyyy/MM/dd}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<DatePicker SelectedDate="{Binding Birthday,
Mode=TwoWay}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</DockPanel>
</Window>

DataGridに名前を設定し、StackPanelのDataContextにCurrentCellプロパティをバンディングさせる。
その上で、各TextBlockにDataGridCellInfoが持つプロパティを設定している。
早速、実行。
起動直後
20120802_1

次、セルをクリックした。
20120802_2
・Columnには、クリックしたセルの列ヘッダが出ている。
・IsValidはtrue(有効)
・Itemは、その行にバインディングされているListのアイテム。
ここまではわかる。次。下のTextBoxをクリックしてフォーカス移動させてみた。
20120802_3

あれ?Falseになってるし、ColumnもItemもとれていない。
どうも、CurrentCellってのはフォーカスが当たっているときだけの情報で、フォーカスが外れると
消えるらしい。ああ、だからDataGridCellInfoなんて構造体を使ってるんだな。
でもなぁ。CurrentCellのItemを現在のアイテムで更新対象なんかにした場合、保存ボタンを押した瞬間に
その情報が消える…。CurrentCellをあてにして、VM側に(TwoWayで)バインディングしても意味ねー!というか使えねーというか…。
かなりがっくり来た。結局、セル系のイベントを取得して、連動しないようにしたんだっけ。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


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

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

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

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