我有一个ObservableCollection<object>
。每个对象都有一个显示在数据网格中的属性列表。一次应该在数据网格中显示一个对象。然后,用户修改数据网格中的属性值。用户应该能够使用组合框选择在数据网格中显示哪个对象。
我不知道如何让DataGrid与原始ObservableCollection<object>
绑定。我目前的解决方案是有一个独立的对象,该对象绑定到ComboBox的SelectedItem,并且DataGrid绑定到该对象。
<ComboBox x:Name="ifcCombo"
DisplayMemberPath="ifcEntity"
SelectedItem="{Binding chosenConcept}"
ItemsSource="{Binding ConceptList}"/>
<DataGrid x:Name="propertiesTable"
ItemsSource="{Binding chosenConcept.propertyList}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding PropertyName}"/>
<DataGridTextColumn Binding="{Binding Mapping}"/>
</DataGrid.Columns>
</DataGrid>
这不是最好的方法。尽管我的DataGrid上确实有一个工作绑定。现在,在我的ViewModel中,我有一个对象需要手动替换原始ObservableCollection<object>
中的对象。所以我可以做一个Linq查询,并替换那个对象,但我觉得必须有一种更合适的方法来进行绑定。
private ObservableCollection<EntityConcept> _ConceptList = new ObservableCollection<EntityConcept>();
private EntityConcept _chosenConcept = new EntityConcept();
提供更多上下文。我将显示我正在讨论的EntityConcept的对象(类):
public class EntityConcept
{
private ObservableCollection<PropertyItem> _propertyList;
private string _ifcEntity;
public ObservableCollection<PropertyItem> propertyList
{
get
{
return _propertyList;
}
set
{
_propertyList = value;
}
}
public string ifcEntity
{
get
{
return _ifcEntity;
}
set
{
_ifcEntity = value;
}
}
}
PropertyItem类是一个具有许多属性的对象,但它们都是基元。
此外,如果您的解决方案将使用ListCollectionView,您将获得加分,因为我最终希望将这些信息分组显示。
您不需要有一个绑定到ComboBox的SelectedItem的独立对象。直接绑定到XAML中的选定属性:
<ComboBox x:Name="ifcCombo"
DisplayMemberPath="ifcEntity"
ItemsSource="{Binding ConceptList}"/>
<DataGrid x:Name="propertiesTable" AutoGenerateColumns="False"
DataContext="{Binding ElementName=ifcCombo, Path=SelectedItem}"
ItemsSource="{Binding propertyList}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding PropertyName}"/>
<DataGridTextColumn Binding="{Binding Mapping}"/>
</DataGrid.Columns>
</DataGrid>
同时添加AutoGenerateColumns="False"
,以防止生成两次列。
假设您也想对所选的概念做些什么
<ComboBox x:Name="ifcCombo"
DisplayMemberPath="ifcEntity"
ItemsSource="{Binding ConceptList}"
SelectedItem="{Binding ChosenConcept}"/>
<Grid>
<Grid.Resources>
<CollectionViewSource x:Key="propertyListCollection" Source="{Binding ChosenConcept.propertyList}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="Foo"/>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</Grid.Resources>
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Source={StaticResource propertyListCollection}}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding PropertyName}"/>
<DataGridTextColumn Binding="{Binding Mapping}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>