Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 复杂类型:在WPF中模板化datagrid_C#_Wpf_Datagrid_Templating - Fatal编程技术网

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
    ,如何设置列的数据模板?那么如何过滤这种情况并设置模板呢
您使用哪个控件来显示控制盘列表?目前,我没有定义控制盘的特殊模板或控制盘列表,因为我不知道如何定义。我不知道如何在datagrid中访问/传递这个Wheel对象。您可以在VM中添加另一个属性,如“CommaseOperatedWheelNames”,它将只获取部件,并将从wheels集合中形成字符串。然后,您可以简单地将同一属性绑定到XAML中的Datagrid。是否显示控制盘的数量或所有属性?您可以在汽车视图模型“wheel_count”中创建属性,或者必须使用主/详细gui来显示汽车下的项目
<TextBlock>
                                <TextBlock.Text>
                                    <MultiBinding StringFormat="{}{0} - {1}">
                                        <Binding Path="Wheels[0].Name"/>
                                        <Binding Path="Wheels[1].Name"/>
                                    </MultiBinding>
                                </TextBlock.Text>
                            </TextBlock>