Bev*_*van 5 wpf user-controls templates itemscontrol
我正在为我的应用程序编写WPF用户控件,包装ListBox和其他一些项目.
ListBox有一个新的ItemTemplate,它为列表中的每个项目提供了四条信息.我可以将四个绑定中的每一个硬编码到列表项上的特定属性,它们显示正常.
但是,我希望我的UserControl更灵活一些.
在ListBox和ComboBox上有一个属性DisplayMemberPath(继承自ItemsControl),它似乎将适当的属性绑定"注入"标准ItemTemplate.
如何通过用户控件获得相同的结果?
我想设置四个新属性以允许配置显示的信息:
public string LabelDisplayPath { get; set; }
public string MetricDisplayPath { get; set; }
public string TitleDisplayPath { get; set; }
public string SubtitleDisplayPath { get; set; }
Run Code Online (Sandbox Code Playgroud)
使用Reflector查看ItemsControl.DisplayMemberPath似乎是在兔子洞里走下去,我无法理解它是如何工作的.
此外,如果我完全偏离正轨 - 而且我应该使用另一种更多的"WPF"技术,请指出我的方向.
更新
这是对我想要实现的目标的澄清.
我的用户控件中的ListBox每个项目显示四条信息:Label,Title,Subtitle和Metric
在一个地方,我想使用此用户控件来显示问题列表.每个问题看起来像这样:
public class Issue {
public string Code { get; set; }
public string Description { get; set; }
public string Priority { get; set; }
public string Reporter { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
显示问题时,我想使用以下映射:
Code --> Label
Description --> Title
Reporter --> Subtitle
Priority --> Metric
Run Code Online (Sandbox Code Playgroud)
在同一个应用程序的其他地方,我有一个我希望使用相同的UserControl显示的帖子列表.每个帖子看起来像这样:
public class Post {
public DateTime PostedOn { get; set; }
public string Title { get; set; }
public string Teaser { get; set; }
public int CommentCount { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
显示帖子时,我想使用以下映射:
PostedOn --> Label
Title --> Title
Teaser --> Subtitle
CommentCount --> Metric
Run Code Online (Sandbox Code Playgroud)
鉴于问题和帖子是完全不同的抽象,我不想强迫它们具有相同的属性,只是为了允许UserControl不变地使用.相反,我想引入一点可配置性,以便我可以干净地在两个站点中重用我的UserControl.
我找到了问题的解决方案 - 它比我想要的要复杂一些......
在任何 ItemsControl 上,当您设置DisplayMemberPath属性时,内部类的实例DisplayMemberTemplateSelector将分配给ItemTemplateSelector。实际上,此类生成具有适当绑定的自定义 DataTemplate 以适应 DisplayMemberPath 的当前配置。DisplayMemberPath每次更改时都会创建并使用此类的新实例。
为了在我自己的 Usercontrol 上复制此内容,我需要创建自己的模板选择器帮助器类并模仿与 ItemsControl 相同的方法,而不是像我最初预期的那样动态修改现有的数据模板。