我可以为DataGrid的项目在Xaml中指定类型吗?

7
在Xaml中创建数据模板时,我可以指定DataTemplate将应用于的项的类型,如下所示:
<DataTemplate DataType="{x:Type Vehicle}">
  <!-- do some stuff with the Vehicle class's properties -->
</DataTemplate>

我希望在创建DataGrid时能够做同样的事情,但DataType属性不提供此选项:

<DataGrid ItemsSource="{Binding Cars}" DataType="{x:Type Vehicle}">
     <!-- Create columns that bind to the Vehicle class's properties -->
</DataGrid>

一个相当糟糕的解决方法是对每一列单独进行操作:
<DataGrid ItemsSource="{Binding Cars}" DataType="{x:Type Vehicle}">
  <DataGrid.Columns>
    <DataGridTemplateColumn>
      <DataGridTemplateColumn.Header />
      <DataGridTemplateColumn.CellTemplate>
        <DataTemplate DataType="{x:Type Vehicle}">
          <!-- bind to a Vehicle class property -->
        </DataTemplate>
      </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    <DataGridTemplateColumn>
      <DataGridTemplateColumn.Header />
      <DataGridTemplateColumn.CellTemplate>
        <DataTemplate DataType="{x:Type Vehicle}">
          <!-- bind to a Vehicle class property -->
        </DataTemplate>
      </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    <DataGridTemplateColumn>
      <DataGridTemplateColumn.Header />
      <DataGridTemplateColumn.CellTemplate>
        <DataTemplate DataType="{x:Type Vehicle}">
          <!-- bind to a Vehicle class property -->
        </DataTemplate>
      </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
  </DataGrid.Columns>
</DataGrid>

有没有更好的做法我不知道?如果我不这样做,ReSharper的各种功能将不能很好地工作。


你尝试过在网格级别上添加具有“DataType”的“DataTemplate”吗? - JGaarsdal
@JesperGaarsdal 我不认为那会有帮助。你最终仍然会有多个“DataType”属性被设置(每个“DataTemplate”一个),不是吗?听起来像是OP试图避免这种情况。 - Mal Ross
你是在试图实现一些代码只是为了让Resharper高兴吗?这不觉得有些不对吗? - icebat
@icebat,我正在尝试实现一些代码来清楚地显示功能的使用情况。ReSharper可以让我们很简单地找到这一点,但在这种情况下不起作用。而且,这还会使Xaml更清晰(告诉您它正在处理什么),但会增加大量重复(这会使它不那么清晰)。 - Jackson Pope
@Jackson,如果你需要的话,也许你可以创建一个DataGrid的子类并添加DataType属性?你将不得不实现一些逻辑并且在每个地方使用这个自定义表格,但它可能会起作用。 - icebat
显示剩余2条评论
2个回答

1
你可以为设计指定数据上下文。
这样做是有效的:
<DataGrid ItemsSource="{Binding Cars}" d:DataContext="{d:DesignInstance Type=Vehicle}">
    <!-- Create columns that bind to the Vehicle class's properties -->
    <!-- The pop-up window will not suggest using the Vehicle class's properties :) -->
</DataGrid>

1

试试这个:

<DataGrid ItemsSource="{Binding Cars}"
          d:DesignSource="{d:DesignInstance Type={x:Type Vehicle}, CreateList=True}">
     <!-- Create columns that bind to the Vehicle class's properties -->
</DataGrid>

谢谢,但这并没有解决任何 ReSharper 混淆的问题。 - Jackson Pope
2
只有按照您上述描述的方式,才能怀疑ReSharper问题。您应该为每个列添加DataType。 - Dzmitry Martavoi
真的还没有其他解决方案吗?:o - Revious

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接