Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在代码中设置xaml DesignInstance属性_C#_Wpf_Xaml_Designer - Fatal编程技术网

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

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

我想在Xaml视图中激活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;
    ...
公共部分类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();
   }
}