从列表中动态删除项目时的 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" 绑定的控件也会更新。
肯特
我有一个 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" 绑定的控件也会更新。
肯特