这实际上是预期的行为:DataGridCell
的DataContex
t是整个行数。
所以你有3个解决方案: 要么你把你的代码背后的结合是这样的:
中的每一列的构造
:
string source = String.Format(CultureInfo.InvariantCulture, "[{0}].", thisColumnIndex);
base.Binding = new Binding(source + "Text");
(你必须找到一种方式来获得的“thisColumnIndex “就我而言,我在创建它们之后立即添加这些列,我简单地将”dataGridOwner.Columns.Count“放在那里)。
or ...
你可以找到一个办法让你想对每一个电池在DataContext(试过,但它搅乱涨得厉害时,行/列虚拟化是上)
或...
看看有:
Binding a cell object's property to a DataGridCell in WPF DataGrid
我个人觉得第一个是我的目的,更好的(因为我在后面反正代码添加我的专栏),但是这是真的取决于你到底...
至于columnHeaders而言(只有columnsHeaders,不是行),你也可以探索“的DataTemplate”的方式:
设置列标题的向列本身(您设置的这种方式列作为DataContext的标题)并使用DataTemplate。
如:
private static DependencyProperty ColumnHeaderProperty = DependencyProperty.Register("ColumnHeader", typeof(MyDataGridColumnHeader), typeof(MyTextBoxColumn));
public MyDataGridColumnHeader ColumnHeader
{
get { return (MyDataGridColumnHeader)(GetValue(ColumnHeaderProperty)); }
set { SetValue(ColumnHeaderProperty, value); }
}
this.ColumnHeader = new MyDataGridColumnHeader();
Header = this;
,并在你的DataGrid的XAML,像:
<DataGrid.ColumnHeaderStyle>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Style.Setters>
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="VerticalContentAlignment" Value="Stretch"/>
<Setter Property="BorderThickness" Value="{Binding BorderThickness}" />
<Setter Property="BorderBrush" Value="{StaticResource DataGridLinesBrush}" />
<Setter Property="Background" Value="{StaticResource DataGridColumnHeaderBackground}" />
<Setter Property="FontFamily" Value="{Binding ColumnHeader.Font.Family, TargetNullValue={StaticResource DefaultFontFamily}}" />
<Setter Property="FontSize" Value="{Binding ColumnHeader.Font.Size, TargetNullValue={StaticResource DefaultFontSize}}" />
<Setter Property="FontStyle" Value="{Binding ColumnHeader.Font.Style, TargetNullValue=Normal}" />
<Setter Property="FontWeight" Value="{Binding ColumnHeader.Font.Weight, TargetNullValue=Bold}" />
<Setter Property="Foreground" Value="{Binding ColumnHeader.Font.Brush, TargetNullValue={StaticResource DataGridColumnHeaderForeground}}" />
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Grid Background="{Binding ColumnHeader.Background}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Image Name="LeftImage" Grid.Column="0" Stretch="None" Margin="3, 0, 0, 0" Source="{Binding ColumnHeader.LeftImage}" VerticalAlignment="Center"/>
<Image Name="RightImage" Grid.Column="2" Stretch="None" Margin="0, 0, 5, 0" Source="{Binding ColumnHeader.RightImage}" VerticalAlignment="Center"/>
<TextBlock Name="HeaderText"
Grid.Column="1"
VerticalAlignment="Center"
HorizontalAlignment="Center"
TextDecorations="{Binding ColumnHeader.Font.Decorations}"
Text="{Binding ColumnHeader.Text}" />
</Grid>
</DataTemplate>
</Setter.Value>
</Setter>
</Style.Setters>
</Style>
</DataGrid.ColumnHeaderStyle>
当然
,我的 “MyDataGridColumnHeader” 类包含了所有的定义
在每列类
这里引用的属性。
希望这有助于。
我也试过这个。它在我的文章中给出了与FindAncestor方法相同的结果。即:它成功绑定,但原始DataContext的“CurrentItem”丢失了。我的问题的罪魁祸首是,我试图引用另一个具有自己的CurrentItem(行[0])的DataTable;如果我只提到一个简单的属性,那么你的方法以及FindAncestor都可以正常工作。 – vuduy 2010-10-13 13:51:10
好吧,我看到了,然后我很抱歉,但我不知道可能是什么问题。希望别人知道 – 2010-10-13 14:47:39