对于上下文,我希望复制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
我还是银光的新手。结果列表List默认执行我正在寻找的行为。以下是遇到此问题的任何人的相关代码:
<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>
但是,我仍然有兴趣获得有关使用数据网格实现此功能的输入。我可能最终需要一些数据网格功能。
感谢。