如何在代码中设置 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# 中以编程方式设置它。没有对应于 DesignInstance
、DesignData
和其余设计时属性的 CLR 类型。
我想在我的 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# 中以编程方式设置它。没有对应于 DesignInstance
、DesignData
和其余设计时属性的 CLR 类型。