如何在代码中设置 xaml DesignInstance 属性

How to set the xaml DesignInstance attribute in Code

我想在我的 Xaml-View 中为 ViewModel 绑定激活 IntelliSense。如果我将以下行放在我的文章视图中,我会在智能感知中看到视图模型属性。

    d:DataContext="{d:DesignInstance viewmodel:ViewModelArticle}"

但我不想在所有视图中手动执行此操作。我想用代码来做。

我已经在我的所有 xaml 视图中实现了泛型继承,就像这样

public partial class ArticleCard : ArticleCardBase
{
    public ArticleCard()
    {
        InitializeComponent();
    }
}

public abstract class ArticleCardBase : CardBase<ViewModel.ViewModelArticle> { }

public abstract class CardBase<TData> : UserControl, IView<TData>, ICardBase where TData : VMCardBase
{
    private CardRibbon _ribbon;
    ...

所以我在我的通用基础 class 中为每个视图都有我的 ViewModel 的具体类型,这也适用于设计器。

现在我尝试像这样设置 DesignInstanceExtension(为了获得我安装的 nuget "ICSharpCode.WpfDesigner" 的扩展):

    public CardBase()
    {
        this.Initialized += CardBase_Initialized;

        var markup = new ICSharpCode.WpfDesign.XamlDom.DesignInstanceExtension(typeof(TData));
        markup.ProvideValue(new Target(this, Window.DataContextProperty));
   }

    public struct Target : IServiceProvider, IProvideValueTarget
    {
        private readonly DependencyObject _targetObject;
        private readonly DependencyProperty _targetProperty;

        /// <summary>
        /// Initializes a new instance of the <see cref="Target"/> struct.
        /// </summary>
        /// <param name="targetObject"></param>
        /// <param name="targetProperty"></param>
        public Target(DependencyObject targetObject, DependencyProperty targetProperty)
        {
            _targetObject = targetObject;
            _targetProperty = targetProperty;
        }

        /// <inheritdoc/>
        public object GetService(Type serviceType)
        {
            if (serviceType == typeof(IProvideValueTarget))
            {
                return this;
            }

            return null;
        }

        /// <inheritdoc/>
        object IProvideValueTarget.TargetObject { get { return _targetObject; } }

        /// <inheritdoc/>
        object IProvideValueTarget.TargetProperty { get { return _targetProperty; } }
    }

此 Target-Object 只是尝试使用 MarkUpExtension ProvideValue 方法,但这不起作用。

有人知道如何在代码中执行此操作吗?

您可以使用 DesignerProperties class 检查应用程序是否处于设计模式:

public abstract class CardBase<TData> : UserControl, IView<TData>, ICardBase where TData : VMCardBase
{
  public CardBase()
  {
    this.Initialized += CardBase_Initialized;

    this.DataContext = DesignerProperties.GetIsInDesignMode(this)
      ? new DesignModeViewModel()
      : new ViewModel();
   }
}

d:DataContext 设计时属性仅在 XAML 和设计者的上下文中可用。您不能在 C# 中以编程方式设置它。没有对应于 DesignInstanceDesignData 和其余设计时属性的 CLR 类型。