我想要达到的目标:
我正在开发Visual Studio插件,并且需要一个MultiSelectComboBox。我想适应VisualStudio的外观,因此为此使用自己的类似乎是个好主意:
Microsoft在其“代码分析”页中使用此类: View /其他Windows/代码分析。
问题:
当然,当我要使用它时,它只是无法正常工作。 :)
这是我如何使用的示例代码:
public TestClass()
{
InitializeComponent();
multiSelectComboBox.ItemsSource = new string[] { "Item 1", "Item 2", "Item 3" };
multiSelectComboBox.AllItemsText = "All items";
}
这是XAML标记:
<UserControl ...
xmlns:vsUiControls="clr-namespace:Microsoft.VisualStudio.Diagnostics.UI.Controls;assembly=Microsoft.VisualStudio.Diagnostics.Common"
...>
<vsUiControls:MultiSelectComboBox x:Name="multiSelectComboBox"/>
</UserControl>
现在出现了MultiSelectComboBox,您可以与它进行交互,但是,当您选择一些而非全部项目时,项目应显示为:
Item 1; Item 3
(假设您选择了除项目2以外的所有项目)。但是,显示的文本只是Item 1Item 3
,完全缺少分隔符。有趣的事情(我已经忽略了很长时间)是,如果您调试代码并请求
multiSelectComboBox.SelectedItemsText
,它将返回正确的值,并用分号分隔。因此,问题是,如果该值存储正确,为什么当我在代码中使用它时,它不能正确显示,而当Microsoft在“代码分析”页上使用它时,为什么显示正确呢?
描述MultiSelectComboBox样式的XAML标记仅包含SelectedItemsText的一个实例,该实例是一个绑定(bind)。请在下面查看我从.Net Reflector获得的信息:
<local:MultiSelectComboBox
p1:UserControl.Name="_this"
p1:AutomationProperties.Name="{Binding RelativeSource={RelativeSource Self},Path=AllItemsText}"
xmlns:p1="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:local="clr-namespace:Microsoft.VisualStudio.Diagnostics.UI.Controls;assembly=Microsoft.VisualStudio.Diagnostics.Common,Version=12.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a">
...
<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<local:CheckComboBox
CheckComboBox.Name="_comboBox"
p4:FrameworkElement.Style="{StaticResource ComboStyle}"
p4:Control.HorizontalContentAlignment="Stretch"
p4:KeyboardNavigation.DirectionalNavigation="Continue"
p4:AutomationProperties.Name="{Binding ElementName=_this,Path=SelectedItemsText,Mode=OneWay}"
xmlns:p4="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<ItemsControl.ItemTemplate>
...
</ItemsControl.ItemTemplate>
</local:CheckComboBox>
</Grid>
</local:MultiSelectComboBox>
我不确定为什么
SelectedItemsText
绑定(bind)到AutomationProperties.Name
(附加?)属性,但这是.Net Reflector给我的。如果调试代码,则可以在Name
中找到存储在CheckedComboxBox
控件的MultiSelectComboBox
属性中的分号分隔的值。值似乎存储正确,绑定(bind)似乎有效,但显示在UI上的文本不包含分隔符。我很困惑...
最佳答案
我看了看反编译的源代码,似乎属性SelectedItemsText仅用于UI自动化(附加的属性AutomationProperties.Name)。实际的显示文本是使用此XAML的showind:
<TextBlock Name="PART_SummaryPartialSelection" Grid.Row="0" Style="{StaticResource DropDownTextBlockStyle}" Visibility="{Binding Path=AllItemsSelected, ElementName=_this, Converter={StaticResource booleanToVisibilityConverterNegative}}">
<ItemsControl Name="PART_Items" Focusable="False" Background="#00FFFFFF" IsHitTestVisible="False" x:Uid="M113" ItemsSource="{Binding SelectedItems, ElementName=_this}" ItemTemplate="{Binding DisplayAreaTemplate, ElementName=_this}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate x:Uid="M115">
<StackPanel IsItemsHost="True" Orientation="Horizontal" x:Uid="M116" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</TextBlock>
所以它只是水平的StackPanel,一个接一个的项目,没有任何分隔符。因此,您将需要修改此模板或只在项目中添加分号(看起来像Visual Studio那样,因为它在最后一个项目-item1; item2;之后显示分号事件)