代码之家  ›  专栏  ›  技术社区  ›  el2iot2

在WPF中有哪些方法可以用于虚拟设计时数据?

  •  92
  • el2iot2  · 技术社区  · 15 年前

    我不使用表达式混合,只在VS2010中使用XAML编辑器。抛开这一点的智慧不谈,我越来越看到设计时数据绑定的需求。对于简单情况, FallbackValue 属性工作得很好(文本框和文本块等)。但尤其是在处理 ItemsControl 类似的,我们确实需要在设计器中显示示例数据,这样您就可以调整和调整控件和数据模板,而无需运行可执行文件。

    我知道 ObjectDataProvider 允许绑定到类型,因此可以提供可视化的设计时数据,但是,通过加载设计时、虚拟数据和运行时绑定,可以在不浪费资源的情况下允许绑定真实的运行时数据,这是一个难题。

    我真正想要的是有能力,比如说,“约翰”、“保罗”、“乔治”和“林戈”在XAML设计器中显示为我的 项目控制 ,但在应用程序运行时显示真实数据。

    我还知道Blend允许一些特殊的属性来定义设计时绑定数据,这些数据在运行时条件下被WPF有效地忽略了。

    所以我的问题是:

    1。如何在Visual Studio XAML设计器中利用集合和重要数据的设计时绑定,然后平滑地交换到运行时绑定?

    2。其他人是如何解决这个设计时与运行时数据问题的? 在我的例子中,我不能很容易地为两者使用相同的数据(例如,一个人可以使用数据库查询)。

    三。它们的表达式混合的替代品是否可以用于数据集成的XAML设计? (我知道有一些替代方法,但我特别想要一些我可以使用和查看绑定样本数据的东西,等等?)

    7 回复  |  直到 7 年前
        1
  •  115
  •   Martin Liversage    13 年前

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

    • 添加命名空间声明

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

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

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

    工作得很好。

        2
  •  7
  •   John Stritenberger    8 年前

    作为戈兰公认答案和雷内优秀评论的混合体。

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

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

        3
  •  4
  •   dthrasher    15 年前

    Karl Shifflett描述了一种在VS2008和VS2010中同样有效的方法:

    Viewing Design Time Data in Visual Studio 2008 Cider Designer in WPF and Silverlight Projects

    LaurentBuginon也有一个类似的方法,专注于表达混合。它 可以 为VS2010工作,但我还没有确认这一点。

    Simulating data in design mode in Microsoft Expression Blend

        4
  •  4
  •   jbe    15 年前

    也许您可以选择Visual Studio 2010和Expression Blend 4的新设计时功能。

    其工作原理如 书库 样品应用 WPF Application Framework (WAF) . 请下载.net4版本。

        5
  •  3
  •   Martin    10 年前

    我使用这种方法生成带有.NET 4.5和Visual Studio 2013的设计时数据。

    我只有一个视图模型。 视图模型具有属性 IsInDesignMode 它指示设计模式是否处于活动状态(参见类 ViewModelBase ) 然后可以在视图模型构造函数中设置设计时数据(如填充项控件)。

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

    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
        }       
    }
    
        6
  •  3
  •   joonas    7 年前

    使用Visual Studio 2017,我一直在尝试遵循所有的指南和问题,例如,我仍然面临着 <ItemsControl> 它只是没有执行我在一个 DesignFooViewModel 继承自 FooViewModel . 我确认了下面的“没有执行”部分 "handy" MSDN guide (扰流板: MessageBox 调试)。虽然这与最初的问题没有直接关系,但我希望它能为其他人节省很多时间。

    结果发现我没做错什么。问题是我的应用程序需要为x64构建。作为 Visual Studio is still in 2018 a 32-bit process 显然不能为设计器部件旋转64位主机进程,它不能使用我的x64类。真正糟糕的是,在我能想到的任何日志中都没有错误。

    因此,如果您在设计时视图模型(例如: <TextBlock Text="{Binding Name}"/> 露面 Name 不管您将属性设置为)原因很可能是您的x64版本。如果由于依赖关系而无法将生成配置更改为anycpu或x86,请考虑创建完全为anycpu且不具有依赖关系(或任何依赖关系)的新项目。因此,最终将代码的大部分或全部初始化部分从“wpf-app”项目拆分为“c类库”项目。

    对于我正在研究的代码库,我认为这将强制健康地分离关注点,代价是一些代码重复,这可能是净的积极的事情。

        7
  •  1
  •   Jack Ukleja    8 年前

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

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

    这样就避免了使用 UserControl.Resources . 静态属性可以作为一个工厂工作,允许您构造非普通数据类型-例如,如果您没有默认的ctor,可以在此处调用工厂或容器来注入适当的依赖项。