我将此类的实例绑定到 DataGrid
public class SomeClass
{
public int m_width { get; set; }
public int m_height { get; set; }
...
public string[] m_content { get; set; }
}
第一列按原样显示数据
<DataGridTextColumn Header="Width" Binding="{Binding m_width}"/>
<DataGridTextColumn Header="Height" Binding="{Binding m_height}"/>
对于最后一列,我需要显示 m_content 并使用 ItemControl 对其进行迭代
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Value}" Foreground="Black">
<DataGrid.Columns>
<DataGridTextColumn Header="Width" Binding="{Binding m_width}"/>
<DataGridTextColumn Header="Height" Binding="{Binding m_height}"/>
<!--custom grid column-->
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<!-- iterates over array of strings -->
<ItemsControl ItemsSource="{Binding m_content}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<!-- how to add binding to other fields ? -->
<TextBlock Text="{Binding .}"></TextBlock>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
但是如何将所有 m_width/m_height 字段绑定到 TextBlock ?
<TextBlock Text="{Binding .}" Width="{Binding m_width}" Height="{Binding m_height}" ...></TextBlock>
我尝试使用relativesource
<TextBlock Text="{Binding .}"
Width="{Binding m_width RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRow}}"
Height="{Binding m_height RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRow}}" ...>
</TextBlock>
但是,无论我使用 Mode 或 AncestorType,都不起作用。
感谢您的帮助
它工作不那么容易的原因是 ItemsControl 中的 DataTemplate 仅获取设置为 ItemsControl 的 ItemsSource 的一个元素。为了能够访问 m_width 和 m_height,您需要访问当前元素“上方”的元素。
一个简单的方法是直接访问祖先,例如使用名称。
<ItemsControl ItemsSource="{Binding m_content}" x:Name="MyItemsControl">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding}"></TextBlock>
<TextBlock Text="{Binding Path=DataContext.m_width, ElementName=MyItemsControl}"></TextBlock>
<TextBlock Text="{Binding Path=DataContext.m_height, ElementName=MyItemsControl}"></TextBlock>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>