数据模板参数

时间:2017-07-19 11:58:55

标签: c# wpf datatemplate

列表中包含要显示的列。我正在使用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?实际上我想知道当前单元格所属的列,但请考虑以下内容:

  1. 这是简化的案例。
  2. 实际上,数据模板更复杂:许多带有绑定,触发器等的元素
  3. 实际上,列相关数据比标题更复杂。
  4. 将在运行时使用不同的标题等生成列。
  5. 在代码隐藏中添加列并设置Header不是问题,DataTemplate是。
  6. 我想在GridViewColumn上使用附加属性,但是,它不是可视树中单元格的父级:

1 个答案:

答案 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

现在视图将如下所示:

我对这个解决方案感到非常高兴,主要是关于什么使它工作的组合,但我想它可以改进。希望在发布答案后,问题变得更清晰