C# DataTemplate中混乱的wpf网格行为
我对ContentTemplate中网格的行为感到困惑: 我想设置我的ListView的样式:C# DataTemplate中混乱的wpf网格行为,c#,wpf,C#,Wpf,我对ContentTemplate中网格的行为感到困惑: 我想设置我的ListView的样式: <Setter Property="ContentTemplate"> <Setter.Value> <DataTemplate> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="auto"/>
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding ArticleID}"
Grid.Column="0"
/>
<TextBlock Text="{Binding ArticleName}"
Grid.Column="1"
/>
<Button Command="{Binding DataContext.RemoveComponentFromVehicle, RelativeSource={RelativeSource AncestorType=Grid}}"
Grid.Column="2"
>
<Button.Content>
<StackPanel Style="{StaticResource IconTextCombo}">
<Image Source="{StaticResource ComponentToVehicle_Delete}"/>
</StackPanel>
</Button.Content>
</Button>
</Grid>
如您所见,我希望确保我的按钮在右侧对齐,因为ArticleID和Name长度可能会有所不同
按钮没有按照我的预期对齐。我有一个测试项目:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBox Text="Foo"
Grid.Column="0"/>
<TextBox Text="Bar"
Grid.Column="1"/>
<Button Content="DELETE"
Grid.Column="2"/>
<TextBox Text="Hello World"
Grid.Column="0"
Grid.Row="1"/>
<TextBox Text="LONG TEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXT"
Grid.Row="1"
Grid.Column="1"/>
<Button Content="DELETE"
Grid.Row="1"
Grid.Column="2"/>
</Grid>
在这个“硬编码”版本中,每一个都按照我想要的方式排列。。。我不知道为什么我的网格在模板中如此奇怪。有人能帮我吗
提前谢谢 您需要在模板中的网格上使用SharedSizeGroup属性。它适用于硬编码示例,因为所有元素都位于同一个网格中。一旦将它们放入列表框中,每个项都有自己的网格,并且不知道其他网格。
设置此属性将确保所有这些列的大小相同,而不管它们位于哪个网格中
您的Grid.columns定义应如下所示:
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" SharedSizeGroup="ColumnA"/>
<ColumnDefinition Width="auto" SharedSizeGroup="ColumnB"/>
<ColumnDefinition Width="auto" SharedSizeGroup="ButtonsColumn"/>
</Grid.ColumnDefinitions>
您还应使用ItemTemplate,这意味着:
<ListBox>
<ListBox.ItemTemplate>
*****Your Posted Code ************
</ListBox.ItemTemplate>
</ListBox>
以下是解决方案:
<ListView DockPanel.Dock="Right"
ItemsSource="{Binding}"
SelectedItem="{Binding }"
Name="lvMain"
HorizontalContentAlignment="Stretch"
>
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition />
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding ArticleID}"
Grid.Column="0"
/>
<TextBlock Text="{Binding ArticleName}"
Grid.Column="1"
/>
<Button Command="{Binding }"
Grid.Column="2"
>
<Button.Content>
<StackPanel Style="{StaticResource IconTextCombo}">
<Image Source="{StaticResource img}"/>
</StackPanel>
</Button.Content>
</Button>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
我已经用ListBox和ListView测试过了。。。这对他们两个都有效,就像我现在想要的那样
谢谢大家的帮助 您确定要在ContentTemplate而不是ItemTemplate中设置模板吗?@GrayFox当所有3列的宽度都设置为自动时,这听起来并不奇怪,这将使它们自动调整为内容宽度。此外,如果希望ListViewItem的内容进行拉伸,则需要在中设置HorizontalContentAlignmentItemContainerStyle@MotiAzu没有ItemTemplate。。。只有ContentTemplate@dkozlHorizontalContentAlignment=stretch无法解决我的问题…@GrayFox ListView肯定有ItemTemplate属性。如果您将其设置为ContentTemplate而不是ContentTemplate,则很有可能解决您的问题。看起来您正试图通过ContentTemplate绑定到项目的属性,这毫无意义。“ButtonsColumn”是什么意思?很抱歉,我是WPFIts的初学者,你可以写一个字符串,David,它会工作的。WPF的布局算法确保用相同字符串标记的每列大小相同。好的,谢谢。。。但它不起作用。我现在就发布我的全部代码,前面有两列,第三列不会对齐。@bum这也是事实,它们应该是*或者有SharedSizeGroup@Amit我现在使用列表框并跟踪您的更新。。。但它不起作用。我已经更新了我的答案,并将SharedSizeGroup添加到所有列中。这应该对你有用