在XAML中为自定义MarkupExtension提供Intellisense

Bra*_*ner 11 c# wpf intellisense xaml markup-extensions

我创建了一个自定义MarkupExtension,允许一种简单的方法将事件转发FrameworkElements到视图模型上的方法.一切都很完美,除了Visual Studio在填写XAML时不提供任何Intellisense.有什么方法可以为Visual Studio提供提供Intellisense所需的信息吗?

MarkupExtension:

public class VmCall : MarkupExtension
{
    public string ActionName { get; }

    public VmCall(string actionName)
    {
        ActionName = actionName;
    }
    //.....
}
Run Code Online (Sandbox Code Playgroud)

视图模型:

class TestWindowVm : ViewModel
{
    public void Click()
    {
        MessageBox.Show("Click!");
    }
}
Run Code Online (Sandbox Code Playgroud)

使用MarkupExtensionin XAML:

<Window
    x:Class="WpfLib.Tests.VmCallMarkupExtension.TestWindow"   
    xmlns:wpfLib="clr-namespace:AgentOctal.WpfLib;assembly=WpfLib"
    //Many xmlns and attributes left out of example for brevity.
    d:DataContext="{d:DesignInstance TestWindowVm}"
    mc:Ignorable="d">
    <Button Click="{wpfLib:VmCall Click}"/>
</Window>
Run Code Online (Sandbox Code Playgroud)

理想情况下,当用户按下"VMCALL"后的空格键,智能感知应该对所有方法的列表呈现它们当前元素的DataContext(只是ClickTestWindowVm在这个具体的例子).

如果一些方法,使这项工作的基础上,与WinForms的以往的经验,我希望某种Attribute我可以放在构造函数的参数进行VmCall告知的Visual Studio如何生成这样的说法智能感知.到目前为止,我还没有找到类似的东西.我不确定我是否真的在寻找错误的东西,或者这根本不可能做到.如果重要,我主要对Visual Studio 2017感兴趣.

我已经查看了所有列出的属性System.Windows.Markup,没有任何明显的内容突然出现在我面前.

小智 1

您已经使用字符串输入创建了一个 MarkupExtension。智能感知如何知道你想要哪个字符串?但是,例如,如果您使用枚举,智能感知会向您建议很多事情。

public enum MyEnum
    {
        first , second 
    }

public class VmCall : MarkupExtension
{
    public MyEnum ActionName { get; }

    public VmCall(MyEnum actionName)
    {
        ActionName = actionName;
    }
    //.....
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
}
Run Code Online (Sandbox Code Playgroud)