C# 绑定依赖于项目类型

C# 绑定依赖于项目类型,c#,wpf,xaml,data-binding,C#,Wpf,Xaml,Data Binding,如何根据绑定项的类型更改绑定值 我使用的是来自的TreeListView,尽管它与标准TreeView的工作原理相同 我有两节课 class Group { public String Name {get;} public Int32 MaxItems {get;} public ObservableList<Item> Items {get;} } class Item { public String Name {get;} public String Sta

如何根据绑定项的类型更改绑定值

我使用的是来自的TreeListView,尽管它与标准TreeView的工作原理相同

我有两节课

class Group
{
  public String Name {get;}
  public Int32 MaxItems {get;}
  public ObservableList<Item> Items {get;}
}

class Item
{
  public String Name {get;}
  public String Status {get;}
}
类组
{
公共字符串名称{get;}
公共Int32 MaxItems{get;}
公共可观察列表项{get;}
}
类项目
{
公共字符串名称{get;}
公共字符串状态{get;}
}
XAML

<Grid>
  <r:TreeListView ItemsSource="{Binding}">
    <r:TreeListView.Resources>
      <HierarchicalDataTemplate DataType="{x:Type local:Group}" ItemsSource="{Binding Items}" />
      <DataTemplate DataType="{x:Type local:Item}" />
    </r:TreeListView.Resources>
    <r:TreeListView.Columns>
      <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=Name}"  />
      <GridViewColumn Header="Status" DisplayMemberBinding="???" />
    </r:TreeListView.Columns>
  </r:TreeListView>
</Grid>

这很好,我可以看到所有组及其项目

在状态列中,我想显示
Item.status
Group.Items.Count+“/”+MaxItems
,具体取决于该行中实际显示的内容

目前我使用的是
{Binding Converter={StaticResource testConverter}}
,其中testConverter根据类型生成输出,但这很麻烦,我希望有一种更干净的方法

我不能/不想创建
组。状态属性。

我想我也不能在数据模板中使用a,因为DisplayMemberBinding会覆盖它们,我希望能够使用多个列/绑定来实现这一点。

到目前为止,我遇到的唯一其他方法是使用
GridViewColumn
的属性。您将需要实现一个选择正确的
数据模板
。从某种意义上讲,它更为简洁,因为您仍然在xaml中定义显示布局/内容,只需选择适当的模板

编辑:是的,在这种情况下不能使用
DisplayMemberBinding
,但是
DisplayMemberBinding
是绑定到路径的
TextBlock
数据模板的简单快捷方式。但是,当您使用datatemplate时,您可以在其中执行所有需要的绑定—在本例中,您不需要
DisplayMemberBinding

快速示例:

<Grid>
    <Grid.Resources>
        <r:NameCellTemplateSelector x:Key="NameTemplateSelector"/>
        <r:StatusCellTemplateSelector x:Key="StatusTemplateSelector"/>
    <Grid.Resources>

    ...

    <GridViewColumn Header="Name" CellTemplateSelector={StaticResource NameTemplateSelector}  />
    <GridViewColumn Header="Status" CellTemplateSelector={StaticResource StatusTemplateSelector} />
</Grid>

您也可以只编写一个选择器,因为
container
参数是UI元素,您可以在可视化树中查找要调用选择器的列,并根据该列进行适当选择。另请参阅此问题的答案:

我用一些示例更新了我的答案。谢谢,这看起来很有希望。在研究之后,这种方法似乎比它的价值更大。我需要为每个列、每个对象类型和每个单元格可能处于的不同状态提供一个DataTemplate,这是非常重要的。@Darcara好吧,您也可以不用为每个单元格提供一个模板,通过使用
DataTrigger
和更改样式使其更加复杂。
public class NameCellTemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        FrameworkElement element = container as FrameworkElement;

        // find the data template with a specific x:Key
        return element.FindResource("someNameTemplate") as DataTemplate;
    }
}

public class StatusCellTemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        FrameworkElement element = container as FrameworkElement;

        // find the data template with a specific x:Key
        return element.FindResource("someStatusCellTemplate") as DataTemplate;
    }
}