打破数据绑定层次结构

时间:2010-08-30 19:30:40

标签: wpf data-binding

我是WPF的新手,我正在尝试做一些专门的数据绑定。具体来说,我有一个DataGrid绑定到一个对象集合,但我希望列的标题绑定到一个单独的对象。你是怎么做到的?

我有几个类定义如下:

public class CurrencyManager : INotifyPropertyChanged
    {
        private string primaryCurrencyName;

        private List<OtherCurrency> otherCurrencies;

         //I left out the Properties that expose the above 2 fields- they are the standard
        //I also left out the implementation of INotifyPropertyChanged for brevity
}

public class OtherCurrency : INotifyPropertyChanged
    {
        private string name;
        private double baseCurAmt;  
        private double thisCurAmt;

        //I left out the Properties that expose the above 3 fields- they are the standard
        //I also left out the implementation of INotifyPropertyChanged for brevity
}

然后XAML的重要部分如下。假设我已经将Page绑定到CurrencyManager类型的特定对象。请注意附加到第二个DataGridTextColumn的标头的绑定是如何不正确的,并且需要以某种方式访问​​CurrencyManager对象的属性PrimaryCurrencyName。也就是说,列的标题具有名称“PrimaryCurrencyName”,并且列中的数据仍然绑定到OtherCurrencies列表的每个元素的属性ThisCurAmt。

<DataGrid ItemsSource="{Binding Path=OtherCurrencies}"  AutoGenerateColumns="False" RowHeaderWidth="0">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Currency Name" Binding="{Binding Path=Name}"/>
                        <DataGridTextColumn Binding="{Binding Path=BaseCurAmt}">
                            <DataGridTextColumn.Header>
                                <Binding Path="PrimaryCurrencyName"/> 
                            </DataGridTextColumn.Header>
                        </DataGridTextColumn>
                        <DataGridTextColumn Header="Amt in this Currency" Binding="{Binding Path=ThisCurAmt}"/>
                    </DataGrid.Columns>

                </DataGrid>

我该怎么做?谢谢!

2 个答案:

答案 0 :(得分:0)

问题是,DataGridTextColumn不是可视树的一部分。

Normaly,这可以使用DataGridTemplateColumn来解决,但在您的情况下,我认为这无济于事。

Jaime Rodriguez可能发表this篇文章 会引导你找到一个解决方案(我只是快速查看它,但它看起来很合适)。

答案 1 :(得分:0)

试试这个:

<DataGridTextColumn Binding="{Binding Path=BaseCurAmt}">
    <DataGridTextColumn.Header>
        <TextBlock>
            <TextBlock.Text>
                <Binding Path="DataContext.PrimaryCurrencyName" 
                        RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}"/>    
            </TextBlock.Text>
        </TextBlock>
    </DataGridTextColumn.Header>
</DataGridTextColumn>

基本上,这个使用RelativeSource来查找DataGrid的DataContext(我假设它是一个CurrencyManager)并显示其PrimaryCurrencyName属性。希望这会有所帮助。