コンテキストとして、マップ視覚化アプリ用に ESRI によって実装された FeatureDataGrid を複製しようとしています。MVVM を使用して、マップとデータを監視可能な DataPoints のコレクションにバインドしました。各 DataPoint には IsSelected プロパティがあり、データグリッドで関連するチェックボックスを変更するか、それを表すマップ グラフィックをクリックすると切り替えられます。
データグリッドから IsSelected CheckBoxColumn を削除し、代わりにデータグリッドで選択するだけで DataPoint の IsSelected プロパティを変更したいと思います。
データグリッドで何かを選択すると IsSelected が変更され、グラフィックの色/サイズの変更によってマップに自動的に反映されるはずです。逆に、マップでオブジェクトを選択すると、データグリッドで強調表示されます。
これは可能ですか?どこから始めればよいですか?
うまくいかなかったいくつかの試みを次に示します。
<sdk:DataGrid x:Name="datagrid" HorizontalAlignment="Left" Width="400" ItemsSource="{Binding Path=Data, Mode=TwoWay}">
<sdk:DataGrid.RowStyle>
<Style TargetType="sdk:DataGridRow">
<Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}" />
</Style>
</sdk:DataGrid.RowStyle>
</sdk:DataGrid>
と
<sdk:DataGrid x:Name="datagrid" HorizontalAlignment="Left" Width="400" ItemsSource="{Binding Path=Data, Mode=TwoWay}" SelectedItem="{Binding IsSelected, Mode=TwoWay}"/>
明確にするために、マップはコレクションにバインドされており、この質問の重要な部分ではありません。DataPoint の IsSelected プロパティを DataGridRow の強調表示/選択状態にバインドする方法を探しているだけです。
さらに情報が役立つかどうか教えてください。
編集
MVVMに違反していると思われる解決策を見つけ、(うまくいけば)不必要なロジックを追加しました。おそらく、MVVMに詳しい人がコメントして、そうでなければ私を納得させるか、私の傾向を確認することができます:
これをコードビハインドに入れる:
public MainPage()
{
InitializeComponent();
Messenger.Default.Register<DataPointSelectedMessage>(this, DataPointSelectedChange);
}
private void DataPointSelectedChange(DataPointSelectedMessage msg)
{
if (datagrid.SelectedItems.Contains(msg.Content))
{
datagrid.SelectedItems.Remove(msg.Content);
}
else
{
datagrid.SelectedItems.Add(msg.Content);
}
}
編集2
私はまだシルバーライトの初心者です。ListBox は、デフォルトで探している動作を行うことがわかりました。これに遭遇した人のための関連コードは次のとおりです。
<ListBox ItemsSource="{Binding Path=Data, Mode=TwoWay}" SelectionMode="Multiple">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsSelected}"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
ただし、これをデータグリッドで実装することについての意見を得るにはまだ興味があります。いくつかのデータグリッド機能が必要になるかもしれません。
ありがとう。