C# 绑定依赖于项目类型
如何根据绑定项的类型更改绑定值 我使用的是来自的TreeListView,尽管它与标准TreeView的工作原理相同 我有两节课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
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;
}
}