【问题标题】:Alignment of DataTemplated Items in Combobox + passing Current item to commandCombobox中DataTemplated项的对齐+将当前项传递给命令
【发布时间】:2018-10-03 21:49:51
【问题描述】:

如何与 WPF 组合框中的右侧 X 按钮对齐?
我得到的是这样的:

Xaml:

<ComboBox ItemsSource="{Binding Entities}" 
      SelectedItem="{Binding SelectedEntity}" >

    <ComboBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>

                <TextBlock Text="{Binding EntityName, Mode=OneWay}"
                           VerticalAlignment="Center"/>

                <Button Grid.Column="1" HorizontalAlignment="Right" 
                        Command="{Binding DataContext.DeleteEntityCommand, 
                        RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}">

                    <Image Source="..\Resources\DeleteIcon.png" HorizontalAlignment="Center" />
                </Button>
            </Grid>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Entities 是一些Entity 类的ObservableCollection
我是否必须使用其他东西来代替Grid

还有一个问题:
如果用户单击某个项目的 X 按钮,则必须将其传递给DeleteEntityCommand(可能使用CommandParameter)。怎么做? SelectedItemComboBox 仍然是 AAAAAA,而不是 HHHH(见图)。

【问题讨论】:

标签: wpf xaml combobox alignment datatemplate


【解决方案1】:

问题是,模板中的网格没有延伸到可用空间。根据这个Post可以实现

<ComboBox>
    <ComboBox.ItemContainerStyle>
        <Style TargetType="ComboBoxItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        </Style>
    </ComboBox.ItemContainerStyle>
    <ComboBox.ItemTemplate>
        <DataTemplate>
        //etc.

注意:如果您没有定义 Button 的宽度,它将被拉伸到剩余的空间。我建议添加 Width=Auto 的 Columndefinition 并在此处添加 Button (Grid.Column=2)。

编辑

附加列旨在像这样(左)填充,因为您的按钮可能会在可用空间(右)中伸展自己。

第二个问题

您可以设置命令的命令参数,如果我没记错的话,可以使用 {Binding} 传递项目本身。

<Button Command={Binding ...} Commandparameter={Binding}/>

并且必须扩展/重载 ICommand 实现以接受参数。

【讨论】:

  • 第二个问题已经回答,我确认,非常感谢。但是HorizontalContentAlignment 的方法对我不起作用。您能否详细说明再添加一列?没听懂。第一列是文本,第三列是按钮,第二列是什么?
  • 没什么,这应该是变量的填充物,Button 和 Text 之间的空白区域(参见编辑)。为了回答您的第一个问题:您的 ComboBox 和 Datatemplate 中的 Grid 的大小是多少?如果手动设置 Grid 的宽度会怎样?
  • 我的问题是GridColumns 的大小设置为Auto。在我将其设置为固定值后,问题就消失了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多