【问题标题】:VS 2015 Extensibility Combo Update when dynamically removing items from list从列表中动态删除项目时的 VS 2015 可扩展性组合更新
【发布时间】:2017-02-03 03:18:16
【问题描述】:

我有一个 VS 2015 可扩展性项目,其中有一个项目组合列表和一个按钮。该按钮打开一个 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." ));
        }

    }

非常感谢您的帮助,肯特

【问题讨论】:

    标签: visual-studio vs-extensibility


    【解决方案1】:

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

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

    就是这样,在变量更新之后,它们“神奇地”绑定到的控件也会更新。

    肯特

    【讨论】:

    • 只是为了澄清,这行_comboSelections = GetComboSelections();导致了自动更新,对吗?
    猜你喜欢
    • 2017-09-12
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 2012-11-17
    相关资源
    最近更新 更多