【问题标题】:MarkupExtension: changing constructor argument is not evaluated in design timeMarkupExtension:在设计时不评估更改的构造函数参数
【发布时间】:2016-01-07 09:14:29
【问题描述】:

如下所示:

更改标记扩展 Key 属性时 - 一切正常。

更改标记扩展构造函数参数时 - 它没有更新。解决方法是使用扩展名更新属性(更改Text)然后返回。然后正确评估值。

这是扩展:

public class MyExtension : MarkupExtension
{
    public string Key { get; set; }

    public MyExtension() { }

    public MyExtension(string key)
    {
        Key = key;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return Key;
    }
}

关于如何让设计器以与使用属性相同的方式使用构造函数参数的任何想法?

【问题讨论】:

  • 你用的是哪个版本的VS?
  • @IlVic,虽然它可能是 VS 错误,但并没有。使用 Microsoft Visual Studio Community 2015 版本 14.0.24720.00 更新 1。请告诉我它是否适合您。
  • 您的 MarkupExtension 可以完美运行 - 例如 - 与 Visual Studio 2010 高级版(版本 10.0.40219.1 SP1Rel)一起使用。如果需要,我也可以使用 Visual Studio 2013 检查。但我没有 Visual Studio 2015
  • @IlVic,你确定吗?尝试更改 xaml {local:My 1} -> {local:My 123} 在每次更改后正确更新的设计器窗口中呈现? {local:My Key=123} 有效,但没有Key,当我尝试更改时,它对我来说保持不变。我尝试禁用扩展程序,但问题仍然存在。
  • 是的,我确定。我复制了您的 MyExtension 代码,然后构建了我的解决方案。然后,如果我在{local:My abc} 中更改{local:My a},那么“abc”会立即呈现在 XAML 预览(或设计器,如您所愿)中。

标签: c# wpf markup-extensions xaml-designer


【解决方案1】:

似乎可以纠正这种情况的方法是像这样使用ConstructorArgumentAttribute

public class MyExtension : MarkupExtension
{
    [ConstructorArgument("key")]
    public string Key { get; set; }

    public MyExtension() { }

    public MyExtension(string key)
    {
        Key = key;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return Key;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    相关资源
    最近更新 更多