我想在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中做到这一点?
您可以使用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();
}
}