C# - WPF - DataGrid - 在列之间共享绑定

问题描述 投票:0回答:1

我将此类的实例绑定到 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>

但是,无论我使用 ModeAncestorType,都不起作用。

感谢您的帮助

c# wpf data-binding
1个回答
0
投票

它工作不那么容易的原因是 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>
© www.soinside.com 2019 - 2024. All rights reserved.