复杂类型:在WPF中模板化数据网格

时间:2017-05-10 12:24:56

标签: c# wpf datagrid templating

我有两个复杂的类,另一个使用这些类。所以我有一系列汽车。每辆车都有一些我希望以列显示的属性,但每辆车都有一系列复杂的物体,在这种情况下我们的车轮。

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>

结果是:

enter image description here

我的解决方案

在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?那么如何过滤这种情况并设置模板呢?

0 个答案:

没有答案