我想要达到的目标:

我正在开发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;之后显示分号事件)

10-08 16:19