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

问题描述 投票:0回答:1

我想在Xaml-Views中激活IntelliSense for ViewModel绑定。如果将以下行放在文章视图中,则会在intellisense中看到viewmodel属性。

    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;
    ...

所以我在每个视图的通用基类中都有具体的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; } }
    }

此目标对象只是尝试使用MarkUpExtension ProvideValue方法,但这不起作用。

有人知道,如何在Code中做到这一点?

c# wpf xaml designer
1个回答
0
投票

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

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();
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.