C# 复杂类型:在WPF中模板化datagrid
我有两个复杂的类,其中一个用于另一个。所以我收集了很多车。每辆车都有一些我喜欢在列中显示的属性,但每辆车也有一个复杂对象的列表,在本例中是我们的轮子C# 复杂类型:在WPF中模板化datagrid,c#,wpf,datagrid,templating,C#,Wpf,Datagrid,Templating,我有两个复杂的类,其中一个用于另一个。所以我收集了很多车。每辆车都有一些我喜欢在列中显示的属性,但每辆车也有一个复杂对象的列表,在本例中是我们的轮子 public class Car { private List<Wheel> wheels; public List<Wheel> Wheels { get { return wheels; } set { wheels = value; } } } pu
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; }
}
}
公车
{
私有列表轮;
公共列表控制盘
{
获取{返回轮;}
设置{wheels=value;}
}
}
公共级车轮
{
私有字符串名称;
公共字符串名
{
获取{返回名称;}
设置{name=value;}
}
}
viewmodel如下所示
public class CarFactoryViewModel
{
private ObservableCollection<Car> cars;
public ObservableCollection<Car> Cars
{
get { return cars; }
set { cars = value; }
}
}
公共类CarFactoryViewModel
{
私家车;
公共可观测收集车
{
获取{返回车辆;}
设置{cars=value;}
}
}
我将datagrid的ItemsSource绑定到汽车上,所有的基本类型都会正确显示,但轮子不会。那么,如何为所有类型为Wheel的对象创建单元格模板呢
我已经尝试使用DataTemplateSelector,但我只获取datarowview的内容,但我喜欢获取Wheel对象。所以也许有更简单的解决方案。我喜欢简单地用Wheels.Name字符串的串联填充单元格
编辑
我尝试了以下操作,但无法获取Wheel.Name属性。迭代Wheels集合并连接字符串有什么诀窍吗?另一个问题是列的筛选/替换不起作用
<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>
如果您知道集合中项目的确切数量,则可以使用多重绑定
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} - {1}">
<Binding Path="Wheels[0].Name"/>
<Binding Path="Wheels[1].Name"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
开放性问题
- 如果对应的数据类型为
,如何设置列的数据模板?那么如何过滤这种情况并设置模板呢李>List
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} - {1}">
<Binding Path="Wheels[0].Name"/>
<Binding Path="Wheels[1].Name"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>