Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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# MVVM是否阻止Visual Studio设计器显示xaml?_C#_Wpf_Visual Studio_Xaml_Mvvm - Fatal编程技术网

C# MVVM是否阻止Visual Studio设计器显示xaml?

C# 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

我注意到在我的程序中,当我有很多复杂的绑定时,VisualStudio不能正确地显示xaml


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中执行这样的代码,这可能会破坏设计器。以下是一些例子:

不要这样做
  • 这将破坏设计器,因为不允许Visual Studio designer执行DB调用

    //ctor
    public MyViewModel()
    {
        using(var db = new MyDbContext()} ... //
    }
    
    无论如何,在constructor中调用DB或文件系统是不好的做法

  • 这会中断设计器,因为VS designer无权访问您的配置

    //ctor
    public MyViewModel()
    {
       string configValue = ConfigurationManager.AppSettings["SomeProperty"]
    }
    
  • 如果您将数据绑定到属性,那么getter将被实际执行。此代码中断设计器,因为App.Current是Visual Studio设计器,而不是您的应用!小心点

    public class MyViewModel
    {
       public string SomeProperty
       {
           get { return App.Current.MainWindow.SomeProperty; }
       }
    }
    
  • 这将在绑定到CountOfItems时导致NullReferenceException,因为VS Designer不调用Load()

    实际上,我没有直接实例化ViewModel,但我注入了ViewModel的设计时版本:

    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

    重述
  • 检查viewmodel中可由xaml执行的所有代码执行路径 设计过程
  • 不要访问这些执行路径中的数据库、Web服务或文件系统
  • 不要访问静态资源,例如Application.Current,因为它们可能未正确初始化
  • 检查数据绑定属性的所有getter。他们可能会尝试返回设计器未初始化的内容
  • 对设计器和运行时执行路径使用分支(例如if..else)
  • 总是生成一些虚假的设计时数据

  • 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" };
        }
    }