什么方法可用于WPF中的虚拟devise时数据?

我在没有expression式混合的情况下工作,只是在vs2010中使用XAML编辑器。 除此之外,我越来越看到devise时数据绑定的需要。 对于简单的情况, FallbackValue属性工作得非常好(Textboxes和TextBlocks等)。 但是特别是在处理ItemsControl之类的时候,真的需要样本数据在devise器中可见,这样您就可以在无需运行可执行文件的情况下调整和调整控件和数据模板。

我知道ObjectDataProvider允许绑定到一个types,因此可以提供可视化的devise时数据,但是有一些杂耍,允许真正的运行时数据绑定,而不浪费资源,通过加载加载两个devise时间,虚假的数据和运行时绑定。

真的,我想要的是在XAMLdevise器中有“约翰”,“保罗”,“乔治”和“林戈”这样的能力,在我的ItemsControl显示为可样式化的项目,但是当应用程序运行

我也知道Blend允许一些特殊的属性来定义WPF在运行时条件下有效忽略的devise时绑定数据。

所以我的问题是:

1.我该如何利用Visual Studio XAMLdevise器中的集合和非平凡数据的devise时绑定,然后顺利地交换到运行时绑定?

2.其他人如何解决这个devise时间与运行时数据问题? 在我的情况下,我不能很容易地使用相同的数据(因为可以用数据库查询)。

3.他们是否可以用于数据集成XAMLdevise的expression式混合? (我知道有一些select,但我特别想要的东西,我可以使用,看到绑定的样本数据等?)

使用VS2010,您可以使用Design-Time属性 (适用于SL和WPF)。 我通常有一个模拟的数据源,所以这只是一个问题:

  • 添加名称空间声明

     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  • 将模拟数据上下文添加到窗口/控制资源

     <UserControl.Resources> <ViewModels:MockXViewModel x:Key="DesignViewModel"/> </UserControl.Resources> 
  • 设置devise时数据上下文

     <Grid d:DataContext="{Binding Source={StaticResource DesignViewModel}}" ... 

工作得不错。

Karl Shifflett描述了一个VS2008和VS2010同样适用的方法:

在WPF和Silverlight项目中查看Visual Studio 2008 Cider Designer中的devise时间数据

Laurent Bugnion有一个类似的方法,专注于Expression Blend。 它可能适用于VS2010,但我还没有证实这一点。

在Microsoft Expression Blend中以devise模式模拟数据

也许Visual Studio 2010和Expression Blend 4的新devise时function是您的一个select。

它的工作原理显示在WPF应用程序框架(WAF)BookLibrary示例应用程序中。 请下载.NET4版本。

作为Goran接受的答案和雷内的优秀评论汞齐。

  • 添加名称空间声明。 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

  • 从代码引用您的devise时间数据上下文。
    <Grid d:DataContext="{d:DesignInstance Type=ViewModels:MockXViewModel, IsDesignTimeCreatable=True}" ...

我使用这种方法用.NET 4.5和Visual Studio 2013生成devise时间数据。

我只有一个ViewModel。 视图模型有一个属性IsInDesignMode ,它告诉devise模式是否激活(见类ViewModelBase )。 然后,您可以在视图模型构造函数中设置您的devise时间数据(如填充项目控件)。

此外,我不会加载视图模型构造函数中的实际数据,这可能会导致在运行时的问题,但设置数据的devise时间不应该是一个问题。

 public abstract class ViewModelBase { public bool IsInDesignMode { get { return DesignerProperties.GetIsInDesignMode(new DependencyObject()); } } } public class ExampleViewModel : ViewModelBase { public ExampleViewModel() { if (IsInDesignMode == true) { LoadDesignTimeData(); } } private void LoadDesignTimeData() { // Load design time data here } } 

类似于评分最高的答案,但在我看来更好:您可以创build一个静态属性来返回devise数据的一个实例,并直接从XAML中引用它,如下所示:

 <d:UserControl.DataContext> <Binding Source="{x:Static designTimeNamespace:DesignTimeViewModels.MyViewModel}" /> </d:UserControl.DataContext> 

这避免了使用UserControl.Resources的需要。 你的静态属性可以作为一个工厂,允许你构造非平凡的数据types – 例如,如果你没有默认的ctor,你可以在这里调用一个工厂或容器来注入适当的依赖关系。