Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使Microsoft.VisualStudio.Diagnostics.UI.Controls.MultiSelectComboBox正常工作 我努力实现的目标:_C#_Wpf_Visual Studio - Fatal编程技术网

C# 如何使Microsoft.VisualStudio.Diagnostics.UI.Controls.MultiSelectComboBox正常工作 我努力实现的目标:

C# 如何使Microsoft.VisualStudio.Diagnostics.UI.Controls.MultiSelectComboBox正常工作 我努力实现的目标:,c#,wpf,visual-studio,C#,Wpf,Visual Studio,我正在开发一个VisualStudio插件,我需要一个多选组合框。我想与VisualStudio的外观和感觉相适应,因此使用他们自己的类来实现这一点似乎是个好主意: 公共类MultiSelectComboBox:UserControl、IComponentConnector、IStyleConnector 名称:Microsoft.VisualStudio.Diagnostics.UI.Controls.MultiSelectComboBox 程序集:Microsoft.VisualStudio

我正在开发一个VisualStudio插件,我需要一个多选组合框。我想与VisualStudio的外观和感觉相适应,因此使用他们自己的类来实现这一点似乎是个好主意:

公共类MultiSelectComboBox:UserControl、IComponentConnector、IStyleConnector
名称:Microsoft.VisualStudio.Diagnostics.UI.Controls.MultiSelectComboBox
程序集:Microsoft.VisualStudio.Diagnostics.Common,版本=12.0.0.0

Microsoft在其代码分析页面中使用此类:View/Other Windows/Code Analysis

问题是: 当然,当我想使用它时,它就不能正常工作。:)

下面是我如何使用它的示例代码:

public TestClass()
{
    InitializeComponent();
    multiSelectComboBox.ItemsSource = new string[] { "Item 1", "Item 2", "Item 3" };
    multiSelectComboBox.AllItemsText = "All items";
}
下面是XAML标记:


现在出现MultiSelectComboBox,您可以与它交互,但是,当您选择一些项目(而不是全部)时,这些项目应该如下所示:
item1;项目3
(假设您选择了除项目2以外的所有项目)。但是,显示的文本只是
项目1项目3
,完全缺少分隔符

有趣的是(我已经忽略了很长一段时间)如果您调试代码并要求使用
multiSelectComboBox.SelectedItemsText
,它将返回正确的值,并用分号分隔

所以问题是,如果该值存储正确,为什么在我的代码中使用它时显示不正确,而在Microsoft在代码分析页面上使用时显示正确

描述MultiSelectComboBox样式的XAML标记只包含SelectedItemsText的一个实例,它是一个绑定。请参阅下面我从.Net Reflector获得的信息:


...
...
我不确定为什么
SelectedItemsText
绑定到
AutomationProperties.Name
(附件?)属性,但这是.Net Reflector给我的。如果调试代码,我可以在
MultiSelectComboBox
中的
CheckedComboxBox
控件的
Name
属性中找到以分号分隔的值


这些值似乎存储正确,绑定似乎有效,但显示到UI的文本不包含分隔符。我只是感到困惑…

我查看了反编译的源代码,似乎属性SelectedItemsText只用于UI自动化(附加属性AutomationProperties.Name)。使用此XAML显示真实显示文本:

<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>


因此,它只是一个水平堆叠面板,没有任何分隔符,一个项目一个项目。因此,您需要修改此模板或仅在项目中添加分号(看起来Visual Studio是这样做的,因为它在最后一个项目-item1;item2;)之后显示分号事件)

感谢Nikolay在XAML中指出了这一重要部分。我会看一看,看看如何让它工作。他们实际做的几乎和你预测的一样,但不是在每个文本后添加分号,而是将3个元素放入堆栈面板(项目1、项目2、项目3)。所有元素都包含两部分:第一部分是文本块,带有项目的文本表示形式(例如“项目1”),第二部分也是文本块,但它只包含分号。堆栈面板上有3个,但它们必须做很多事情,因为它们在静态分析中的括号中有一个计数器,当它们在“PART_SummaryPartialSelection”中将事物串在一起时,这个计数器会被删除。因此,现在事情真的开始变得丑陋、混乱和困难。我没有将你的答案标记为解决方案,尽管它非常有用,但我仍然没有有效的代码(