I know how to do it in code, but can this be done in XAML ?
Title="Window1" Height="300" Width="300">
<ComboBox Name="ComboBox1" HorizontalAlignment="Left" VerticalAlignment="Top">
public partial class Window1 : Window
double width = 0;
foreach (ComboBoxItem item in ComboBox1.Items)
if (item.DesiredSize.Width > width)
width = item.DesiredSize.Width;
ComboBox1.Width = ComboBox1.DesiredSize.Width + width;
This can't be in XAML without either:
The reason for this is that the default ComboBox ControlTemplates that I've come across (Aero, Luna, etc.) all nest the ItemsPresenter in a Popup. This means that the layout of these items is deferred until they are actually made visible.
An easy way to test this is to modify the default ControlTemplate to bind the MinWidth of the outermost container (it's a Grid for both Aero and Luna) to the ActualWidth of PART_Popup. You'll be able to have the ComboBox automatically synchronize it's width when you click the drop button, but not before.
So unless you can force a Measure operation in the layout system (which you can do by adding a second control), I don't think it can be done.
As always, I'm open to an short, elegant solution -- but in this case a code-behind or dual-control/ControlTemplate hacks are the only solutions I have seen.