2011-12-12 97 views
23

我一个文本框绑定到一个对象,像这样:如何使用d:DesignInstance和没有默认构造函数的类型?

<TextBlock d:DataContext="{d:DesignInstance ViewModel:TaskVM }" 
      Text="{Binding Title}" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"> 
    </TextBlock> 

现在我想知道如何使它在设计过程中显示模拟数据。我试着做这样的事情:

<TextBlock Text="{Binding Path=Title}" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"> 
    <d:DesignProperties.DataContext> 
     <ViewModel:TaskVM Title="Mock"/> 
    </d:DesignProperties.DataContext> 
    </TextBlock> 

然而,由于TaskVM没有默认的构造函数,我得到一个“没有默认构造函数”中找到。

我知道,当我使用d:DataContext="{d:DesignInstance ViewModel:TaskVM }"它创建一个模拟数据类型。有没有办法让我设置这个模拟类型的属性?

谢谢!

回答

37

默认构造需要在XAML被实例化的类型。作为一种解决方法,您可以简单地创建TaskVM的子类,该类将具有默认构造函数并将其用作设计时数据上下文。

<TextBlock d:DataContext="{d:DesignInstance ViewModel:DesignTimeTaskVM }" 
      Text="{Binding Title}" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"> 
</TextBlock> 

另一种方法是设置d:IsDesignTimeCreatableFalse和替代型会为你在运行时(使用TaskVM类型为“形状”)来创建。

<TextBlock d:DataContext="{d:DesignInstance ViewModel:DesignTimeTaskVM, IsDesignTimeCreatable=False}" 
      Text="{Binding Title}" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"> 
</TextBlock> 
+0

我喜欢这个主意:)。继承将允许我跳过重新创建所有属性。我仍然更喜欢有一种内置的方式来操纵WPF创建的模拟对象。它创建了一个模拟对象,不是吗?它在MSDN文档中提到:d:IsDesignTimeCreatable \t 在d:DesignInstance标记扩展中,指定从您的类型创建设计实例,而不是由设计器生成的替代类型。 – VitalyB

+0

@VitalyB - 是的,你是对的。它看起来像您可以设置'd:IsDesignTimeCreatable'到'FALSE'和替代型会为你在运行时创建(使用您的TaskVM类型为“形状”)。确切地说, –

+1

。这是非常令人生畏的,我无法设置该替代类型的属性。 – VitalyB

3

您可以添加一个默认的构造函数到您的虚拟机。然后它可以检查它是否处于设计时间并为其属性设置适当的设计时间值。

+12

另一种选择是创建一个默认的构造函数,并与 纪念吧'[过时(“只能使用设计模式”,真)]' 因此,如果您尝试使用它提出了一个编译错误。 – DonkeyMaster

+0

链接已死。请参阅此问题:https://stackoverflow.com/q/834283/200443 – Maxence

2

另一种方法是使用一个静态类来保存视图模型并调用该类从XAML。 下面是一个例子:

XAML中使用视图模型工厂创建设计数据方面:

xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
mc:Ignorable="d" 
d:DataContext="{x:Static local:ViewModelFactory.ViewModel}" 


静态ViewModelFactory构建在其构造并将其存储在视图模型中的公共属性它可以从外部访问(从XAML):

public static class ViewModelFactory 
{ 
    /// <summary> 
    /// Static constructor. 
    /// </summary> 
    static ViewModelFactory() 
    { 
     ViewModel = new TypeOfViewModel(null); 

     // further configuration of ViewModel 
    } 

    public static TypeOfViewModel ViewModel 
    { 
     get; set; 
    } 
} 



请注意ŧ hat TypeOfViewModel类没有无参数的构造函数。 因此,ViewModelFactory必须通过一些值,在这种情况下,null

所以在这种情况下TypeOfViewModel类需要实现的方式,它知道在设计时传入的依赖项为空。

public class TypeOfViewModel 
{ 
    /// <summary> 
    /// Constructor. 
    /// </summary> 
    /// <param name="dependency">May be null at design time</param> 
    public TypeOfViewModel(SomeDependentClass dependency) 
    { 

    } 
} 
相关问题