2017-07-19 86 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

現在視圖將看起來是這樣的:

我很高興這個解決方案,主要是關於事物的組合是什麼使得它的工作,但我想它可以改善。希望發佈答案後,問題變成更清晰