MVVM 将数据网格绑定到列表中的<Object>一个对象



我有一个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>

相关内容

  • 没有找到相关文章

最新更新