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

时间:2017-01-25 20:49:03

标签: visual-studio vs-extensibility

我有一个VS 2015 Extensibility项目,其中有一个项目组合列表和一个按钮。该按钮打开一个WPF工具窗口,允许用户将新项目更改/添加到组合列表,或者可以删除列表。

如果我在工具窗口的列表中添加了一个项目,它会成功添加该项目,也可以成功删除该项目。问题是,如果我删除组合列表中当前选定的项目,则在用户单击它之前不会刷新。这可能会导致用户出现其他问题,因为所选的条目不再在列表中。如何获取组合列表以反映更新。下面显示了初始化对象的包代码以及我尝试刷新组合的位置。

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." ));
        }

    }

非常感谢你的帮助,肯特

1 个答案:

答案 0 :(得分:0)

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

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

在变量更新之后,它们所处的控制也是如此,并且#34;神奇地"界。

肯特