我有两个复杂的类,另一个使用这些类。所以我有一系列汽车。每辆车都有一些我希望以列显示的属性,但每辆车都有一系列复杂的物体,在这种情况下我们的车轮。
public class Car
{
private List<Wheel> wheels;
public List<Wheel> Wheels
{
get { return wheels; }
set { wheels = value; }
}
}
public class Wheel
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
viewmodel看起来像这样
public class CarFactoryViewModel
{
private ObservableCollection<Car> cars;
public ObservableCollection<Car> Cars
{
get { return cars; }
set { cars = value; }
}
}
我将datagrid的ItemsSource绑定到汽车,所有原始类型都将正确显示,但不会显示轮子。那么如何为 Wheel 类型的所有对象模板化单元格。
<Window.Resources>
<local:CarFactoryViewModel x:Key="ViewModel"/>
</Window.Resources>
<Grid>
<DataGrid ItemsSource="{Binding Source={StaticResource ViewModel}, Path=Cars}"/>
</Grid>
我已经尝试过使用DataTemplateSelector,但我只获得了datarowview的内容,但我喜欢得到Wheel对象。所以也许有更简单的解决方案。我喜欢用Wheels.Name字符串的连接来填充单元格。
修改
我尝试了以下内容,但我无法获取Wheel.Name属性。有没有一个技巧来迭代车轮集合并连接字符串?另一个问题是过滤/替换列不起作用。
<DataGrid ItemsSource="{Binding Source={StaticResource ViewModel}, Path=Cars}">
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate DataType="{x:Type local:Wheels}">
<Label Content="{Binding Wheels.Count}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
结果是:
我的解决方案
在DataTemplate中使用另一个控件,例如ItemsControl。如果您想要更自定义的解决方案,请创建一个新控件。
<ItemsControl ItemsSource="{Binding Wheels}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Label Content="{Binding Name}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
如果您知道集合中项目的确切数量,那么您可以使用MultiBinding。
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} - {1}">
<Binding Path="Wheels[0].Name"/>
<Binding Path="Wheels[1].Name"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
开放式问题
List<Wheels>
,如何为列设置datatemplate?那么如何过滤这种情况并设置模板呢?