2017-07-19 55 views
1

有清单,要显示的列。我正在使用ListView以及单元格的数据模板。我的问题是访问都:从模板的行和列。数据模板参数

以下是演示,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?事实上,我只想知道当前单元格属于哪一列,但请考虑以下内容:

  1. 这是简化的情况。
  2. 实际上,数据模板比较复杂:很多元素都带有绑定,触发器等等。
  3. 实际上,列相关数据比标题更复杂。
  4. 列将在与不同的报头运行时动态生成等
  5. 添加列和在设定Header代码隐藏不是问题,DataTemplate是。

我想用附加属性上GridViewColumn,但是,这不是在视觉树细胞的父:

+1

难道你不能只绑定到一个类型的实例,该类型对于行索引和列索引都有属性? – mm8

+0

@ mm8,你能解释一下你的意思吗? – Sinatr

+0

'Converter'怎么样?并使用'{RelativeSource Self}'作为参数?那么你将分别访问UIElement和转换器'Grid.GetRow(UIElement)'或'Grid.GetColumn()'? – XAMlMAX

回答

0

如果你想参数传递到数据模板,然后你需要更多的MVVM(C)未知WPF程序员

@ MM8,是正确的,我的设计缺少一个更抽象,抱柱信息(列名称)。我已经创建列视图模型(再次简化):

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与列实例绑定到Content所有单元格,然后在视图需要另一个数据模板(此时在XAML完全定义),要知道如何进行可视化:

<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获取物品)访问,我们必须使用ListViewItem.DataContext

现在视图将看起来是这样的:

我很高兴这个解决方案,主要是关于事物的组合是什么使得它的工作,但我想它可以改善。希望发布答案后,问题变成更清晰