【问题标题】:StackPanel inside Grid - how to put its elements in different columnsStackPanel inside Grid - 如何将其元素放在不同的列中
【发布时间】:2023-03-23 23:01:01
【问题描述】:

这是我的代码:

<Grid x:Name="SourceGrid">
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>

    </Grid.RowDefinitions>

        <TextBlock Grid.Row="0" Grid.Column="0" Text="Headers" />
        <TextBlock Grid.Row="0" Grid.Column="1" Text="Tags" />



    <ItemsControl Grid.Row="1" Grid.ColumnSpan="2" ItemsSource="{Binding Path=AllHeaders.Fields}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding}" />
                    <ComboBox ItemsSource="{Binding ElementName=SourceGrid, Path=DataContext.Tags}" />
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

如您所见,我在 DataTemplate 内部有一个 TextBlock 和一个 ComboBox,后者位于 StackPanel 内部。我想要做的是将 TextBlock 放入网格的 Column=0 中,并将 ComboBox 放入网格的 Column=1 中。我怎样才能做到这一点? Grid.Column 属性在 TextBlock 和 ComboBox 中均不可访问。

【问题讨论】:

  • 为什么不使用DataGridListView 开箱即用的标头?

标签: c# wpf xaml grid stackpanel


【解决方案1】:

这是你的新布局:

<Grid x:Name="SourceGrid">
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>

        <TextBlock Grid.Row="0"
                   Grid.Column="0"
                   Text="Headers" />
        <TextBlock Grid.Row="0"
                   Grid.Column="1"
                   Text="Tags" />

        <ItemsControl Grid.Row="1"
                      Grid.ColumnSpan="2"
                      ItemsSource="{Binding Path=AllHeaders.Fields}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Grid x:Name="SourceGrid">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition />
                            <ColumnDefinition />
                        </Grid.ColumnDefinitions>
                        <TextBlock Text="{Binding}"
                                   Grid.Column="0" />
                        <ComboBox ItemsSource="{Binding Path=DataContext.Tags, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Grid},AncestorLevel=2}}"
                                  Grid.Column="1" />
                    </Grid>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>

  <Grid x:Name="SourceGrid">
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>

        <TextBlock Grid.Row="0"
                   Grid.Column="0"
                   Text="Headers" />
        <TextBlock Grid.Row="0"
                   Grid.Column="1"
                   Text="Tags" />

        <ItemsControl Grid.Row="1"
                      Grid.ColumnSpan="2"
                      ItemsSource="{Binding Path=AllHeaders.Fields}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Grid x:Name="SourceGrid">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition />
                            <ColumnDefinition />
                        </Grid.ColumnDefinitions>
                        <TextBlock Text="{Binding}"
                                   Grid.Column="0" />
                        <ComboBox ItemsSource="{Binding Path=DataContext.Tags, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ItemsControl}}}"
                                  Grid.Column="1" />
                    </Grid>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>

【讨论】:

  • 它可以正常工作,但是出现了一个问题:当我使用您的布局时,我的 ComboBox 没有任何内容。当我使用我的布局时,它具有应有的内容(它绑定到 DataContext.Tags)。这是为什么?您的布局不会以任何方式更改绑定。
  • 好的,解决了这个问题 - 您在我的 DataTemplate 中添加了 Grid 并为其指定了 name 属性,该属性已被父 Grid 使用。
  • 是的,因为我没有关注DataContext。我想不是没关系。我更正了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多