我有一个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." ));
}
}
非常感谢你的帮助,肯特
答案 0 :(得分:0)
我的答案是,包控件很像WPF,底层变量绑定到包中的控件。解决方案通过修改事件处理程序来更新这些变量,并忘记控件,因为它们似乎受到约束。如下所示:
private void OnMyEventHandler( object sender, MyEventArgs eventArgs )
{
_myService.Refresh();
_comboSelections = GetComboSelections();
_currentComboSelection = eventArgs.NewSelection;
}
在变量更新之后,它们所处的控制也是如此,并且#34;神奇地"界。
肯特