有员工,他们有很多字段——姓氏、名字等。我想以表格的形式显示所有员工的列表。它发生在具有 MVVM 模式的 Wpf 中。所以我有一个这样的片段视图:
<ListView
ItemsSource="{Binding Path=AllEmployees}"
>
<ListView.View>
<GridView>
<GridViewColumn
Header="Фамилия"
DisplayMemberBinding="{Binding Path=LastName}"
/>
<GridViewColumn
Header="Имя"
DisplayMemberBinding="{Binding Path=FirstName}"
/>
</GridView>
</ListView.View>
</ListView>
因此,有一个 ViewModel,其中 AllEmployees 是一个包含员工对象的集合。这些对象仅具有 LastName、FirstName 等属性。
我想要的是?不要用手声明每个 GridViewColumn 也不要给它一个 Header 和绑定,而是像这样在 ViewModel 中声明一些字典(或其他东西,我只是举了一个例子)
public Dictionary<string, string> Columns = new Dictionary<string, string>()
{
{ "EmployeeId", "Табельный №" },
{ "TitleOfCourtesy", "Обращение" },
{ "LastName", "Фамилия" },
{ "FirstName", "Имя" },
{ "Title", "Должность" },
{ "HireDate", "Дата найма" },
{ "ReportsTo", "Подчиняется" }
};
并从此字典中形成 GridViewColumns。因此,通过键,可以清楚地从员工对象中获取哪个属性,并通过值 - 在表中为该属性赋予什么标题。
我无法弄清楚如何在 XAML 中执行此操作。以某种方式通过列模板,或以其他方式。
此行为可以使用
AttachedProperty
.GridViewColumns
。在这个类中,我们创建了三个
AttachedProperty
(在工作室中有一个片段 -propa
):Source
(object
) - 它将用于指定带有列的集合。Header
(string
) - 将负责标题。DisplayMember
(string
) - 负责该列应显示的属性的名称。我们最终会得到这样的结果:
现在让我们订阅更新
Source
并在处理程序中为此事件创建测试列:我们在注册中添加我们需要的
Source
handler我们创建处理程序本身,在其中检查对象的类型,如果有新对象,则创建列:
好吧,一个简单的生成列的方法:
我们绑定所有东西,运行它,看到我们已经成功创建了一个测试列(我在测试集合中有1个对象)
太好了,已经完成了一半的工作,我们还需要处理标题和属性。
让我们创建一个返回属性值的辅助方法:
此外,为方便起见,我们会将一列的生成移到单独的方法中。
在这个方法中,我们从属性
DisplayMember
和Header
它们的值中获取,如果它们不为空,那么我们分配它们:让我们重写方法中列的创建
CreateColumns
:就是这样,这是一个这样的实现的基本示例,让我们测试一下:
创建测试数据:
我们在 XAML 中绑定所有内容:
这里
DisplayMember
, 和Header
是类中相应属性的名称Column
, 和Source
是列集合本身。结果将是包含此人姓名的一列:
让我们再添加几列:
结果:
如您所见,一切顺利。我以这个答案为基础,它有很多东西我没有在这里开始转移,因为我的任务是展示基本原理,我把这个的进一步发展留给你。