C# MVVM是否阻止Visual Studio设计器显示xaml?
我注意到在我的程序中,当我有很多复杂的绑定时,VisualStudio不能正确地显示xamlC# MVVM是否阻止Visual Studio设计器显示xaml?,c#,wpf,visual-studio,xaml,mvvm,C#,Wpf,Visual Studio,Xaml,Mvvm,我注意到在我的程序中,当我有很多复杂的绑定时,VisualStudio不能正确地显示xaml MVVM及其众多绑定是否会导致这种情况?在visual studio designer中显示xaml以完全删除绑定最安全的方法是什么?是如果绑定和Viewmodel很复杂,则设计时可能无法正常工作。但如果需要设计时支持,则可以创建虚拟viewmodel,并将其设置为设计时viewmodel,该模型将仅在设计时使用虚拟viewmodel。检查下面的代码 d:DataContext="{d:DesignIn
MVVM及其众多绑定是否会导致这种情况?在visual studio designer中显示xaml以完全删除绑定最安全的方法是什么?是如果绑定和Viewmodel很复杂,则设计时可能无法正常工作。但如果需要设计时支持,则可以创建虚拟viewmodel,并将其设置为设计时viewmodel,该模型将仅在设计时使用虚拟viewmodel。检查下面的代码
d:DataContext="{d:DesignInstance Type=yourviewmodetype, IsDesignTimeCreatable=True}"
不,MVVM的核心原则之一是设计器支持。该原理在Expression Blend designer(resp Blend for Visual Studio)工具之后称为“可混合性”。请注意,VisualStudio使用相同的设计器 使用MVVM,您可以通过数据绑定到设计时数据来实现更好的设计时支持。例如,在DataGrid或ListBox中,您可以在设计器中看到数据绑定时实际项目的外观 破坏设计器与绑定的复杂性无关 你只需要遵循一些简单的原则,了解设计师的工作 首先,VisualStudioDesigner在设计器过程中创建ViewModel的实例。您需要小心,不要在viewmodel中执行这样的代码,这可能会破坏设计器。以下是一些例子: 不要这样做
//ctor
public MyViewModel()
{
using(var db = new MyDbContext()} ... //
}
无论如何,在constructor中调用DB或文件系统是不好的做法//ctor
public MyViewModel()
{
string configValue = ConfigurationManager.AppSettings["SomeProperty"]
}
public class MyViewModel
{
public string SomeProperty
{
get { return App.Current.MainWindow.SomeProperty; }
}
}
public class MyViewModel()
{
protected MyViewModel()
{
//both runtime and design time logic.
//you may use IsDesignMode check if needed
}
public MyViewModel(ISomeExternalResource externalResource) : this();
{
//this is executed only at run time
_externalResource = externalResource;
Items = externalResouce.GetAll();
}
public List<string> Items {get; protected set;}
}
public class MyViewModelDesignTime : MyViewModel
{
public MyViewModelDesignTime () : base()
{
//this will be show in the designer
Items = new List<string> { "Item1", "Item2" };
}
}
公共类MyViewModel()
{
受保护的MyViewModel()
{
//运行时逻辑和设计时逻辑。
//如果需要,您可以使用IsDesignMode检查
}
公共MyViewModel(ISomeExternalResource externalResource):this();
{
//这仅在运行时执行
_externalResource=externalResource;
Items=externalresource.GetAll();
}
公共列表项{get;protected set;}
}
公共类MyViewModelDesignTime:MyViewModel
{
公共MyViewModelDesignTime():base()
{
//这将在设计器中显示
Items=新列表{“Item1”、“Item2”};
}
}
如果您的设计器仍然中断,并且您不知道原因,那么可以将另一个VisualStudio实例附加到xaml设计器进程,它将很好地显示有问题的代码行
最后,但并非最不重要的一点是,可以轻松关闭ViewModels的实例化。只需在d:DataContext中设置IsDesignTimeCreatable=false 重述
XAML设计器不能很好地处理MVVM。但我不会因为头皮发痒就用电锯砍头。这与MVVM无关,而是与Visual Studio中的XAML设计器和XAML设计器相比,它产生的子进程完全是有缺陷的,已经存在了3年了。从烦恼,如冻结VS;无法工作的属性编辑器。改用表达式混合(如果可以的话)。我从来没有遇到过EBStop使用拖放和键入XAML的问题。它的速度快了1000倍,标记越来越清晰,而且也不差。@MickyD:Expression Blend已经多年不存在了。现在有了VisualStudio的Blend。但是,VisualStudio使用与Blend相同的XAML设计器。“那你在说什么?”里罗借口,借口。当你醒来发现自己在矩阵中时,你会像“那只是文本,我什么都看不到,啊,我刚被章鱼机器人杀死了”最后,但并非最不重要的是,你可以很容易地关闭ViewModels的实例化。只需在d:DataContext中设置IsDesignTimeCreatable=false。或者,在XAML设计器的工具栏上,选择“禁用项目代码”按钮-来源:@MotKohn:唯一的问题是,当设计器失败时,该按钮通常不可见:)如果您正在使用
调度程序执行异步任务,请注意。除此之外,这是一个多么好的答案!干得好@LieroBig谢谢!我处理这个问题已经有一段时间了,最后谷歌找到了我的答案。
//ctor
public MyViewModel
{
bool IsDesignMode => DesignerProperties.GetIsInDesignMode(new DependecyObject());
public MyViewModel()
{
if (IsDesignMode)
{
//this will be shown in the designer
Items = new List<string>{ "Item1", "Item2" }
}
}
//INotifyPropertyChanged details ommited due to simplification
public List<string> Items {get; private set;}
public void Load()
{
//optionally you may check IsDesignMode
using (var db = new MyDbContext())
{
this.Items = db.Items.Select(i => i.Name).ToList();
}
}
}
d:DataContext="{d:DesignInstance Type=local:MyViewModelDesignTime, IsDesignTimeCreatable=True}"
public class MyViewModel()
{
protected MyViewModel()
{
//both runtime and design time logic.
//you may use IsDesignMode check if needed
}
public MyViewModel(ISomeExternalResource externalResource) : this();
{
//this is executed only at run time
_externalResource = externalResource;
Items = externalResouce.GetAll();
}
public List<string> Items {get; protected set;}
}
public class MyViewModelDesignTime : MyViewModel
{
public MyViewModelDesignTime () : base()
{
//this will be show in the designer
Items = new List<string> { "Item1", "Item2" };
}
}