Что вы можете сделать, так это создать конвертер, который будет возвращать самую длинную длину одного свойства вашего объекта.Вы можете реализовать конвертер так:
public class LongestListObjectToIntConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is IEnumerable<FooBar>)
{
IEnumerable<FooBar> list = (IEnumerable<FooBar>)value;
return list.Max(bar => bar.FullName.Length);
}
// Default value to return
return 100;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
А затем просто свяжите свойство Width вашего ComboBox, предоставив список в качестве привязки пути, а конвертер - в качестве конвертера значений.
<Window.Resources>
<conv:LongestListObjectToIntConverter x:Key=converter/>
</Windows.Resources>
...
<ComboBox ItemsSource="{Binding Path=Foo.Bars}" Width="{Binding Path=Foo.Bars, Converter={StaticResource converter}}"/>
Таким образом, даже если ваша коллекция изменится и об этих изменениях не будет сообщено, ComboBox изменит размер в зависимости от самого длинного слова.
Другая интересная идея состоит в том, чтобы сделать самосвязывание с Width и захватить фактический выпадающий список.в преобразователе, чтобы затем проверить отображаемое значение, я думаю, это было бы еще лучше.
Преимущество этого решения заключается в том, что он не использует кодовый код и легко используется повторно.Вы можете найти больше информации о ValueConverters здесь: http://www.wpftutorial.net/ValueConverters.html