【发布时间】:2018-03-29 13:26:29
【问题描述】:
在将 ComboBox 与枚举项一起使用时,我发现了一个奇怪的行为。我注意到当我单击 ComboBox 时显示条目的弹出窗口会截断长项目。我发现这是因为我定义了一个具有固定宽度的 TextBlock 样式。奇怪的是,当我使用枚举项时,宽度只会影响组合框。如果我改用字符串,它不会发生。
这是一张关于正在发生的事情的图片。第三项应该是“VeryLongTypeName”。
这是按照 MVVM 模式编写的代码示例。
用户控件 XAML:
<UserControl.DataContext>
<local:SampleViewModel/>
</UserControl.DataContext>
<StackPanel>
<StackPanel.Resources>
<Style TargetType="TextBlock">
<Setter Property="Width" Value="70"/>
<Setter Property="Margin" Value="0,0,5,0"/>
</Style>
</StackPanel.Resources>
<DockPanel>
<TextBlock Text="Items"/>
<ComboBox ItemsSource="{Binding ItemsList}" SelectedItem="{Binding Item}"/>
</DockPanel>
<DockPanel>
<TextBlock Text="String Items"/>
<ComboBox ItemsSource="{Binding StringItemsList}" SelectedItem="{Binding StringItem}"/>
</DockPanel>
</StackPanel>
SampleViewModel 代码:
public class SampleViewModel
{
public enum SomeType { Type1, Type2, VeryLongTypeName };
public IEnumerable<SomeType> ItemsList
{
get { return (SomeType[])Enum.GetValues(typeof(SomeType)); }
}
public SomeType Item { get { return ItemsList.First(); } set { } }
public IEnumerable<string> StringItemsList
{
get { return ItemsList.Select(type => type.ToString()); }
}
public string StringItem { get { return StringItemsList.First(); } set { } }
}
如果您构建代码示例,在图片下方的第二个 ComboBox 中,字符串值会顺利进行。
我有以下问题:
为什么更改类型会影响图形?
使用枚举时如何修复 ComboBox 显示?
欢迎任何帮助。
【问题讨论】:
-
ComboBox 中的项目是否也可能被视为
TextBlock类型?因为这看起来像相同的宽度。不太了解 WPF,但也许您不应该以这种全局方式应用您的样式。 -
如果设置 ComboBox.ItemTemplate 会发生什么?
-
@Nyerguds 是的,我也注意到了。我在帖子中提到,由于 TextBox 样式,组合框中的项目被截断。如果您删除该样式,项目将正常显示。
-
@Fredrik 好的,那行得通。我使用了带有 Text="{Binding}" 的 TextBox 的 DataTemplate。谢谢。第一个问题呢?
-
StringItem = StringItemsList[0];在您的构造函数中是正确的方法。