在WPF中设计时间数据

时间:2011-01-17 18:17:14

标签: wpf mvvm expression-blend design-time

[使用vs2010&表达式混合v4]

嗨 - 试图在WPF和Blend中加载一些设计时数据,使用Josh Smith的概念:http://joshsmithonwpf.wordpress.com/2010/04/07/assembly-level-initialization-at-design-time/ e.g。

[AttributeUsage(AttributeTargets.Assembly)]
public class DesignTimeBootstrapperAttribute : Attribute
{
    public DesignTimeBootstrapperAttribute(Type type)
    {
        var dep = new DependencyObject();
        Debug.WriteLine("here..?");
        if (DesignerProperties.GetIsInDesignMode(dep))
        {
            // TODO: Design-time initialization…
            IBootstrapper instance = Activator.CreateInstance(type) as IBootstrapper;
            if (instance != null)
            {
                instance.Run();
            }
        }
    }
}

我的属性在AssemblyInfo.cs中,AppBootstrapper扩展了MefBootstrapper。

[assembly: AssemblyCopyright("Copyright ©  2010")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: DesignTimeBootstrapper(typeof(AppBootstrapper))]

我不想使用Blend样本数据,a)因为它似乎没有为ObservableCollection创建数据而b)我按照定义处于设计模式,因此事情会发生很大变化,但是我的“生成的数据”不会。

无论如何,似乎没有任何事情发生。

Q1:如何调试我的引导程序的设计时初始化? Q2:我的View XAML中是否需要额外的混合命名空间/属性等?

(在我的引导程序中,我只是注册了一个不同的模块,我想用DesignTimeService替换RunTimeService,导出IService接口)。

TIA

1 个答案:

答案 0 :(得分:3)

调试:

  • 在VS2010中打开您的项目
  • 在程序集属性构造函数
  • 中设置断点
  • 启动Blend 4的新实例
  • 从VS2010使用Debug - >附加到流程:并选择混合
  • 切换到混合并打开您的项目
  • 打开引用您的示例数据的XAML文件

此外,任何Debug.WriteLine都应出现在VS2010输出窗口中。

如果您无法使用属性方法(我自己没有尝试过),您可以使用MVVM Light中的此方法(我已使用过):

private bool? _isInDesignMode;

public bool IsInDesignMode
{
    get
    {
        if (!_isInDesignMode.HasValue)
        {
            var prop = DesignerProperties.IsInDesignModeProperty;
            _isInDesignMode =
                (bool)DependencyPropertyDescriptor
                .FromProperty(prop, typeof(FrameworkElement))
                .Metadata.DefaultValue;
        }

        return _isInDesignMode.Value;
    }
}