1

我在尝试绑定集合中的一些属性而不是元素的属性时感到困惑。我什至不确定如何正确表达它...代码可能会更好地解释:这里是类型(不是实际代码,我已将其缩短为基础):

public class myType
{
    public int P {get;set;}
}
public class myTypeCollection : ObservableCollection<myType>
{
    public int Ptotal {get { return this.Items.Select(i=>i.P).Aggregate((c,t)=>t = t + c); }}
    public int Pmin { get { this.Items.Min(i => i.P); } } //concept
    public int Pmax { get { this.Items.Max(i => i.P); } } //concept
}

它们正在模板化控件中使用,其 XAML 如下所示:(添加注释以使其尽可能清晰)

<!-- myGridObject = new myTemplatedControl(); -->
<!-- myGridObject.DataContext = new myTypeCollection(); -->
<!-- NOTE: collection obviously is NOT empty in the real code -->
<sdk:DataGrid ItemsSource={Binding DataContext}> 
    <sdk:DataGridTemplateColumn Width="Auto">
        <sdk:DataGridTemplateColumn.HeaderStyle>
            <Style TargetType="sdk:DataGridColumnHeader">
                <Setter Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate>

                            <!-- ?????? write out Ptotal in the header of the column ??????? -->
                            <!-- This throws a binding-related ArgumentException -->
                            <TextBlock Text="{Binding ???? Ptotal ?????}" />

    <!-- closing tags cut off -->
    <sdk:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding P}" />
    <!-- closing tags cut off once more-->

{Binding P}可以按预期工作,因为P它是项目的属性,但是如何访问集合的属性,例如Ptotal,Pmin等?

感谢您抽时间阅读。如果缺少任何信息,请指出,我会发布它。

4

3 回答 3

0

结果客户改变了对网格标题的想法,他不想再在标题中显示总计。

顺便说一句,我一定尝试了 20 种不同的方法,包括修补各种类型的转换器,但我无法完成这个看起来不像看起来那么简单的任务。

再次感谢您提出的有趣建议。

于 2012-04-23T08:53:21.023 回答
0

我认为问题在于 DataGrid 绑定到集合,并且每一行都绑定到单个项目,而不是集合。您需要访问链上的一个级别(回到集合本身)。

如果您正在运行 Silverlight 4+,则可以使用 relativesource。例如:

<TextBlock Text="{Binding Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType=sdk:DataGrid, AncestorLevel=1}, Path=DataContext.Count}"

否则,可能会创建对上下文的静态访问以通过绑定访问它Source

于 2012-04-18T14:12:23.380 回答
0

所以你需要集合对象作为你的绑定源。

你需要这些:

相对源标记扩展

Binding.RelativeSource 属性

像这样的东西(未经测试):

    <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, 
AncestorType={x:Type myTemplatedControl}}, Path=DataContext.Ptotal}" />

如果 DataGrid 在您的自定义myTemplatedControl. 我并不完全清楚 myGridObject 到底是什么。主要思想是:

正如 MSDN 文档所说:Binding.RelativeSourceGets or sets the binding source by specifying its location relative to the position of the binding target.

如果您坚持使用 x:Type 扩展,这里有一个关于它的链接,因此您可以将它与您的自定义控件一起使用:

X:类型

另一种方法是,如果您命名您的容器元素(您的集合是数据上下文),那么您可以将该元素设置为绑定源:

<TextBlock Text="{Binding ElementName=yourElementName, Path=DataContext.Ptotal}" />
于 2012-04-18T14:10:59.033 回答