对于上下文,我希望复制 ESRI 为地图可视化应用程序实现的 FeatureDataGrid。使用 MVVM,我将地图和数据绑定到一个可观察的数据点集合。每个 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
我对 Silverlight 还是很陌生。原来 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>
但是,我仍然有兴趣获得有关使用数据网格实现此功能的输入。我可能最终需要一些数据网格功能。
谢谢。