C# ITagAggregator<;T>;。塔格桑吉德永远不会被解雇

C# ITagAggregator<;T>;。塔格桑吉德永远不会被解雇,c#,mef,C#,Mef,我有相当简单的TagProvider,我想通过我的定制装饰来使用它。这一切都很好,除了挂在TagsChange事件 下面是我用来获取标签服务工厂的代码: [Import] internal IViewTagAggregatorFactoryService AggregatorService = null; ... MyTagAggregator = AggregatorService.CreateTagAggregator<MyTag>(View); MyTagAggr

我有相当简单的TagProvider,我想通过我的定制装饰来使用它。这一切都很好,除了挂在TagsChange事件

下面是我用来获取标签服务工厂的代码:

[Import]
internal IViewTagAggregatorFactoryService AggregatorService = null;

...    

MyTagAggregator = AggregatorService.CreateTagAggregator<MyTag>(View); 
MyTagAggregator.TagsChanged += MyTagAggregator_TagsChanged;
[导入]
内部IViewTagAggregatorFactoryService AggregatorService=null;
...    
MyTagAggregator=AggregatorService.CreateTaggregator(视图);
MyTagAggregator.TagsChanged+=MyTagAggregatoru TagsChanged;
但MyTagAggregator_TagsChanged委托从未被激发。我尝试了不同类型的标签,有些是定制的,有些是内置的(例如SmartTag)


我是否遗漏了什么,是否应该在使用此事件之前设置其他内容?

经过一些研究,我找到了问题所在

AggregatorService.CreateTaggregator方法将调用IViewTaggerProvider.CreateTaggregator方法。在我的例子中,实现是这样的:

[Export(typeof(IViewTaggerProvider))]
[ContentType("text")]
[TextViewRole(PredefinedTextViewRoles.Document)]    
[TagType(typeof(MyTag))]
internal class MyTaggerProvider : IViewTaggerProvider
{
    public ITagger<T> CreateTagger<T>(ITextView textView, ITextBuffer buffer) where T : ITag
    {
        return new MyTagger(this) as ITagger<T>;
    }
}
[导出(类型(IViewTaggerProvider))]
[内容类型(“文本”)]
[TextViewRole(预定义的textViewRoles.Document)]
[TagType(typeof(MyTag))]
内部类MyTaggerProvider:IViewTaggerProvider
{
公共ITagger CreateTagger(ITextView textView,ITextBuffer buffer),其中T:ITag
{
将新的MyTagger(this)返回为ITagger;
}
}
这将始终返回TagAggregator的新实例。所以,当我在一个例子中改变了一些东西,它自然不会影响到其他人。解决方案是利用TextView上的Properties属性,因此后续每次调用都将返回特定TextView的相同实例:

[Export(typeof(IViewTaggerProvider))]
[ContentType("text")]
[TextViewRole(PredefinedTextViewRoles.Document)]    
[TagType(typeof(MyTag))]
internal class MyTaggerProvider : IViewTaggerProvider
{
    public ITagger<T> CreateTagger<T>(ITextView textView, ITextBuffer buffer) where T : ITag
    {
        return TextView.Properties.GetOrCreateSingletonProperty(delegate() { return new MyTagger(this); }) as ITagger<T>;
    }
}
[导出(类型(IViewTaggerProvider))]
[内容类型(“文本”)]
[TextViewRole(预定义的textViewRoles.Document)]
[TagType(typeof(MyTag))]
内部类MyTaggerProvider:IViewTaggerProvider
{
公共ITagger CreateTagger(ITextView textView,ITextBuffer buffer),其中T:ITag
{
返回TextView.Properties.GetOrCreateSingletonProperty(委托(){返回新的MyTagger(this);})作为ITagger;
}
}

请在您的描述中添加一段代码,您可以在其中实例化您的聚合器服务,它已经存在了。AggregatorService由VS服务初始化。初始化没有问题,CreateTagAggregator方法正在工作,我正在获取对MyTagAggregator的引用,同时设置委托工作,但事件从未触发。在我看到的大多数例子中,这已经足够了。