WPF LIstView绑定到列标题

时间:2011-02-15 12:05:45

标签: c# wpf listview binding

我正在尝试创建一个动态绑定到一组日期的列表视图。因此,用户可以选择日期范围,所选日期的结果将显示在列标题中的日期。我只使用了一个问题,日期没有显示在标题中。我有以下内容,我看不出它为什么不起作用的原因:

public class KPIResult : DependencyObject
{
    public static readonly DependencyProperty DateProperty = DependencyProperty.Register("Date", typeof(DateTime), typeof(KPIResult), new UIPropertyMetadata(null));

    public DateTime Date
    {
        get { return (DateTime)GetValue(DateProperty); }
        set { SetValue(DateProperty, value); }
    }

    public static readonly DependencyProperty ResultProperty = DependencyProperty.Register("Result", typeof(int), typeof(KPIResult), new UIPropertyMetadata(null));

    public int Result
    {
        get { return (int)GetValue(ResultProperty); }
        set { SetValue(ResultProperty, value); }
    }
}

ListView的代码:

    <ListView Margin="6" ItemsSource="{Binding ElementName=This, Path=KPICollection}" Name="lvKPIView" Grid.ColumnSpan="2">
        <ListView.View>
            <GridView>
                <GridViewColumn Width="40" >
                    <GridViewColumnHeader Tag="KPIResult[0]" Content="{Binding Path=KPIResults[0].Date}" />
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <Grid>
                                <TextBlock Text="{Binding Path=KPIResults[0].Result}" />
                                <TextBox Text="{Binding Path=KPIResults[0].Result}" />
                            </Grid>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>

结果显示得很好。标题中没有日期:(。

任何想法的人?

干杯, SumGuy

1 个答案:

答案 0 :(得分:4)

尝试这种方式:

<ListView Margin="6" DataContext="{Binding ElementName=This}" ItemsSource="{Binding KPICollection}" Name="lvKPIView" Grid.ColumnSpan="2">
    <ListView.View>
        <GridView>
            <GridViewColumn Width="40" >
                <GridViewColumnHeader Tag="KPIResult[0]" Content="{Binding KPICollection.KPIResults[0].Date}" />
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Grid>
                            <TextBlock Text="{Binding Path=KPIResults[0].Result}" />
                            <TextBox Text="{Binding Path=KPIResults[0].Result}" />
                        </Grid>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

显然,问题在于您尝试绑定到属性而未指定绑定源,并且没有将控件的DataContext设置为任何内容。 CellTemplate内部绑定工作的原因是行的数据上下文自动设置为相应的列表项实例,但对于标头不是这样 - 它们从父控件继承数据上下文。因此,如果我们为DataContext指定ListView,那么标头中使用的绑定将具有指向该数据上下文的相对路径:{Binding KPICollection.KPIResults[0].Date}