【问题标题】:How do I set WPF xaml form's Design DataContext to class that uses generic type parameters如何将 WPF xaml 表单的 Design DataContext 设置为使用泛型类型参数的类
【发布时间】:2012-01-04 08:17:35
【问题描述】:

最初我的 .xaml 表单使用以下行来设置设计器的 DataContext,其中视图模型是非泛型类型 (注意我说的是设计时 DataContext,而不是将在运行时).

<Window ...
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"    
d:DataContext="{d:DesignInstance Dialogs:CustomerSearchDlogViewModel}"
...>

现在,我有一个通用的 SearchDialogViewModel 而不是 CustomerSearchDlogViewModel,但我无法弄清楚 标记中可以使用什么语法来让我指定该视图模型。

【问题讨论】:

标签: wpf xaml datacontext


【解决方案1】:

除非标记扩展 (DesignInstance) 提供属性来传递类型参数,否则这是不可能的,我对此表示怀疑。因此,您可能希望按照建议进行子类化或编写自己的标记扩展来创建通用实例(事实上,这就是我正在做的现在)。

编辑:这个扩展应该可以做到:

public class GenericObjectFactoryExtension : MarkupExtension
{
    public Type Type { get; set; }
    public Type T { get; set; }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        var genericType = Type.MakeGenericType(T);
        return Activator.CreateInstance(genericType);
    }
}

最初我从类型名称获取对象类型时遇到了一些问题,但您可以让 XAML 解析器为您解析类型,这很简洁:

DataContext="{me:GenericObjectFactory Type={x:Type Dialogs:CustomerSearchDlogViewModel`1},
                                      T=Data:Customer}"

(注意末尾的`1 引用一个泛型类型。如果你去掉x:Type 包裹反引号会导致错误。)

【讨论】:

  • 我不知道如何做后者,所以如果你这样做并写一个博客或任何可能对我有帮助的东西,我会是一个狂热的读者。
  • @Tod:这是一个很大的痛苦,它需要很多反思,我有点卡住了,如果有什么来自它,我会编辑我的答案并告诉你。
  • @Tod:我想我终于找到了办法。
  • @H.B.我自己想出了一个类似的解决方案,但是 IntelliSense 似乎不适用于此。你知道是否可以进一步调整,以便 VS2013 的 IntelliSense 让你完成绑定?
  • @poke:抱歉,帮不了你,现在还没有安装在任何地方......
【解决方案2】:

一个干净的选择是创建一个新类型,它只是扁平化泛型类型:

public class CustomerSearchDialogViewModel : SearchDialogViewModel<Customer> 
{
}

【讨论】:

  • 因为我已经有一个 CustomerSearchDialogViewModel,所以清除它的内容并按照你的建议重新定义它会很简单(而不是删除它)。我没有想到这一点,而且找出不能做的事情总是很好的。
猜你喜欢
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
  • 2011-11-26
  • 2011-02-28
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多