C# 如何在代码中设置xaml DesignInstance属性
我想在Xaml视图中激活IntelliSense for ViewModel绑定。如果我在我的文章视图中放置以下行,我将在intellisense中看到viewmodel属性C# 如何在代码中设置xaml DesignInstance属性,c#,wpf,xaml,designer,C#,Wpf,Xaml,Designer,我想在Xaml视图中激活IntelliSense for ViewModel绑定。如果我在我的文章视图中放置以下行,我将在intellisense中看到viewmodel属性 d:DataContext="{d:DesignInstance viewmodel:ViewModelArticle}" 但我不想在所有视图中手动执行此操作。我想用代码来做 我已经在所有xaml视图中实现了通用继承,如下所示 public partial class ArticleCard : ArticleC
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;
...
公共部分类ArticleCard:ArticleCardBase
{
公共物品卡()
{
初始化组件();
}
}
公共抽象类ArticleCardBase:CardBase{}
公共抽象类CardBase:UserControl、IView、ICardBase其中TData:VMCardBase
{
私人卡彩带;;
...
因此,我在每个视图的通用基类中都有ViewModel的具体类型,这也适用于设计器
现在,我尝试如下设置DesignInstanceExtension(以获取我安装的扩展名nuget“ICSharpCode.WpfDesigner”):
public CardBase()
{
this.Initialized+=CardBase\u Initialized;
var markup=new ICSharpCode.WpfDesign.XamlDom.DesignInstanceExtension(typeof(TData));
ProvideValue(新目标(这个,Window.DataContextProperty));
}
公共结构目标:IServiceProvider、IProvideValueTarget
{
私有只读从属对象_targetObject;
私有只读从属属性_targetProperty;
///
///初始化结构的新实例。
///
///
///
公共目标(DependencyObject targetObject、DependencyProperty targetProperty)
{
_targetObject=targetObject;
_targetProperty=targetProperty;
}
///
公共对象GetService(类型serviceType)
{
if(serviceType==typeof(IProvideValueTarget))
{
归还这个;
}
返回null;
}
///
对象IProvideValueTarget.TargetObject{get{return}
///
对象IProvideValueTarget.TargetProperty{get{return}
}
此目标对象只是尝试使用MarkUpExtension ProvideValue方法,但不起作用
有人知道如何在代码中执行此操作吗?您可以使用该类检查应用程序是否处于设计模式:
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();
}
}
公共抽象类CardBase:UserControl、IView、ICardBase其中TData:VMCardBase
{
公共卡库()
{
this.Initialized+=CardBase\u Initialized;
this.DataContext=DesignerProperties.GetIsInDesignMode(this)
?新设计模式视图模式()
:新建ViewModel();
}
}
d:DataContext设计时属性仅在XAML和设计器的上下文中可用。您不能在C#中以编程方式设置它。没有对应于设计实例
、设计数据
和其他设计时属性的CLR类型。谢谢您的回答,但这不是我想要的我想模拟d:DataContext=“{d:DesignInstance viewmodel:ViewModelArticle}”-我的c#基类代码中的一行。用Xaml编写的这行代码给了我intellisense。我不想设置真正的dataContext。我认为你不理解intellisense是什么。它与你的代码无关,它是IDE的一个特性。Xaml标记只是IDE用作帮助的东西,被实际代码忽略。我不认为它是可能的除非IDE添加了该功能,否则可以按您的方式设置默认或特定的数据上下文。我理解IntelliSense。我希望得到这样的答案:“是的,这是可能的,但不是那么容易。编写自己的xaml扩展,就像这样…”…我相信这可以工作-xaml或visual studio扩展不会是问题。是的,我很担心。我会等几天,然后我会将此标记为答案…:-|
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();
}
}