从列表中动态删除项目时的 VS 2015 可扩展性组合更新

VS 2015 Extensibility Combo Update when dynamically removing items from list

我有一个 VS 2015 可扩展性项目,其中有一个项目组合列表和一个按钮。按钮,打开一个 WPF 工具 window,允许用户向组合列表 alter/add 一个新项目,或者可以删除列表。

如果我在我的工具 window 上向列表中添加一个项目,它会成功添加该项目,也能成功删除该项目。问题是,如果我删除组合列表中当前选定的项目,则在用户单击它之前不会刷新。这可能会给用户带来其他问题,因为所选条目已不在列表中。我怎样才能得到组合列表来反映更新。下面显示了初始化对象的包代码以及我尝试刷新组合的位置。

public RegConnectionsCommand( Package package, IMyService myService )
{
    if( package == null )
    {
        throw new ArgumentNullException( "package" );
    }

    _package = package;
    _myService  = myService ;

    if( CommandService != null )
    {
        var dropDownCombo = new CommandID(   
            PackageGuids.guidMyServicePackageCmdSet, 
            (int)PackageIds.cmdIdCombo );
            var dropDownComboCommand = new OleMenuCommand( OnDropDownCombo, dropDownCombo );
            dropDownComboCommand.ParametersDescription = "$";
            CommandService.AddCommand( dropDownComboCommand );


        var dropDownComboList = new CommandID( 
            PackageGuids.guidMyServicePackageCmdSet, 
            (int)PackageIds.cmdIdComboGetList );
        var dropDownComboListCommand = new OleMenuCommand( OnDropDownComboList, dropDownComboList );
        CommandService.AddCommand( dropDownComboListCommand );

        var cmdEdit = new CommandID( 
            PackageGuids.guidMyServicePackageCmdSet, 
            (int)PackageIds.cmdIdEditor);
        var buttonCommand = new OleMenuCommand( ShowEditorWindow , cmdEdit );
        CommandService.AddCommand( buttonCommand );
    }

    _currentComboSelection = _myService.FindValueKey();
 }
 private void ShowEditorWindow( object sender, EventArgs e )
 {    
    ToolWindowPane window = _package.FindToolWindow( typeof(ToolWindowEditor), 0, true );
    if( (window == null) || (window.Frame == null) )
    {
        using (ResXResourceSet resource = new ResXResourceSet( @".\VSPackage.resx" ))
        {
            throw new NotSupportedException( resource.GetString( "CanNotCreateWindow" ) );                    
        }
    }            
    var control = window.Content as Editor;

    if( control != null )
    {
        var context = control.DataContext as EditorViewModel;
        if( context != null )
            context.MyEvent += OnMyEventHandler;
    }

    IVsWindowFrame windowFrame = (IVsWindowFrame)window.Frame;
    ErrorHandler.ThrowOnFailure( windowFrame.Show() );


}

private void OnMyEventHandler( object sender, EventArgs eventArgs )
{
    // how do i get at the combo control here?   
}

下拉组合事件会正确地重新填充列表,但只有在您单击它时才会出现,但我需要在他们单击下拉列表之前执行此操作,但我不知道如何获得我的组合事件处理程序。

    private void OnDropDownComboList( object sender, EventArgs e )
    {
        var eventArgs = e as OleMenuCmdEventArgs;

        if( eventArgs == null )
            throw new ArgumentException( "Event arguments are required." );

        IntPtr outPtr = eventArgs.OutValue;

        if( outPtr != IntPtr.Zero )
        {
            _comboSelections = GetComboSelections();
            Marshal.GetNativeVariantForObject( _comboSelections, outPtr );
        }
        else
        {
            throw (new ArgumentException( "The output argument is required." ));
        }

    }

非常感谢你的帮助,肯特

我发现答案是包控件很像 WPF,并且底层变量绑定到包中的控件。该解决方案通过修改事件处理程序来更新这些变量,而忘记了控件,因为它们似乎是绑定的。如下所示:

    private void OnMyEventHandler( object sender, MyEventArgs eventArgs )
    {
        _myService.Refresh();
        _comboSelections = GetComboSelections();
        _currentComboSelection = eventArgs.NewSelection;
    }

就是这样,变量更新后,"magically" 绑定的控件也会更新。

肯特