Combobox中DataTemplated项目的对齐+将当前项目传递给命令
Alignment of DataTemplated Items in Combobox + passing Current item to command
如何与 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
class 的 ObservableCollection
。
我必须使用其他东西来代替 Grid
吗?
还有一个问题:
如果用户单击某个项目的 X 按钮,则必须将其传递给 DeleteEntityCommand
(可能使用 CommandParameter
)。怎么做? ComboBox
的 SelectedItem
仍然是 AAAAAA,而不是 HHHH(见图)。
问题是,模板中的网格没有延伸到可用 space。根据这个 可以用
来实现
<ComboBox>
<ComboBox.ItemContainerStyle>
<Style TargetType="ComboBoxItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
</ComboBox.ItemContainerStyle>
<ComboBox.ItemTemplate>
<DataTemplate>
//etc.
注意:如果您没有定义 Button 的宽度,它将被拉伸到剩余的 space。我建议添加一个 Width=Auto 的 Columndefinition 并在那里添加 Button (Grid.Column=2).
编辑
额外的列应该是这样的填充物(左),因为您的按钮可能会在可用的space(右)上伸展。
第二题
您可以设置命令的命令参数,如果我没记错的话,可以使用 {Binding} 传递 Item 本身。
<Button Command={Binding ...} Commandparameter={Binding}/>
并且 ICommand 实现必须 extended/overloaded 才能接受参数。
如何与 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
class 的 ObservableCollection
。
我必须使用其他东西来代替 Grid
吗?
还有一个问题:
如果用户单击某个项目的 X 按钮,则必须将其传递给 DeleteEntityCommand
(可能使用 CommandParameter
)。怎么做? ComboBox
的 SelectedItem
仍然是 AAAAAA,而不是 HHHH(见图)。
问题是,模板中的网格没有延伸到可用 space。根据这个
<ComboBox>
<ComboBox.ItemContainerStyle>
<Style TargetType="ComboBoxItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
</ComboBox.ItemContainerStyle>
<ComboBox.ItemTemplate>
<DataTemplate>
//etc.
注意:如果您没有定义 Button 的宽度,它将被拉伸到剩余的 space。我建议添加一个 Width=Auto 的 Columndefinition 并在那里添加 Button (Grid.Column=2).
编辑
额外的列应该是这样的填充物(左),因为您的按钮可能会在可用的space(右)上伸展。
第二题
您可以设置命令的命令参数,如果我没记错的话,可以使用 {Binding} 传递 Item 本身。
<Button Command={Binding ...} Commandparameter={Binding}/>
并且 ICommand 实现必须 extended/overloaded 才能接受参数。