列表中包含要显示的列。我正在使用ListView
单元格的数据模板。我的问题是访问:模板中的行和列。
下面是demo,xaml:
<ListView x:Name="listView" ItemsSource="{Binding Items}">
<ListView.Resources>
<GridViewColumn x:Key="Column" x:Shared="False">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock>
<Run Text="{Binding WhatHere}" /> <!-- problem here -->
<Run Text="{Binding Mode=OneWay}" />
</TextBlock>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</ListView.Resources>
<ListView.View>
<GridView />
</ListView.View>
</ListView>
和代码:
public partial class MainWindow : Window
{
public List<string> Items { get; } = new List<string> { "1", "2", "3" };
public MainWindow()
{
InitializeComponent();
DataContext = this;
var a = (GridViewColumn)listView.FindResource("Column");
a.Header = "a";
((GridView)listView.View).Columns.Add(a);
var b = (GridViewColumn)listView.FindResource("Column");
b.Header = "b";
((GridView)listView.View).Columns.Add(b);
}
}
将产生
我的目标是:
a b
a1 b1
a2 b2
a3 b3
可能?如何传递列到DataTemplate
?实际上我想知道当前单元格所属的列,但请考虑以下内容:
答案 0 :(得分:0)
如果你想将参数传递给数据模板,那么你需要更多MVVM(c)未知的wpf程序员
@ mm8,是对的,我的设计缺少一个抽象来保存列信息(列名)。我要创建列视图模型(再次简化):
where lower(title) in ('harry potter', 'the lord of the rings')
并且添加列的代码将变为类似
public class ViewModelColumn
{
public string Column { get; }
public ViewModelColumn(string column)
{
Column = column;
}
}
在后面的代码中创建单元格数据模板。我们的想法是为列实例绑定到var a = new FrameworkElementFactory(typeof(ContentControl));
a.SetValue(ContentControl.ContentProperty, new ViewModelColumn("a"));
((GridView)listView.View).Columns.Add(new GridViewColumn
{
Header = "a",
CellTemplate = new DataTemplate { VisualTree = a }
});
的所有单元格提供ContentControl
,然后视图需要另一个数据模板(这次完全在xaml中定义),以了解如何将其可视化:
Content
此类单元格<DataTemplate DataType="{x:Type local:ViewModelColumn}">
<TextBlock>
<Run Text="{Binding Column, Mode=OneTime}" />
<Run Text="{Binding DataContext,RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}}, Mode=OneWay}" />
</TextBlock>
</DataTemplate>
包含列信息。要访问行(从DataContext
访问项目),我们必须使用Items
。
现在视图将如下所示:
我对这个解决方案感到非常高兴,主要是关于什么使它工作的组合,但我想它可以改进。希望在发布答案后,问题变得更清晰。