2011-08-12 2 views
3

я поставил экземпляр одного из виртуальных машин в словаре ресурсов, как:Как получить «нуль» объекта ObjectDataProvider в режиме разработки?

<ObjectDataProvider ObjectType="{x:Type WpfApplication1:MyViewModel}" x:Key="TheViewModel"/> 

Я связываю DataContext некоторых пользовательских элементов управления для этого:

<WpfApplication1:UserControl1 x:Name="UsrCtrl1" DataContext="{StaticResource TheViewModel}"/> 

и она отлично работает в режиме исполнения, потому что все соединения и серверы доступны, и много логических объектов правильно инициализированы.

Проблема в том, что во время разработки я получаю много исключений (их много), которые делают работу очень сложной.

Можно ли как-то сказать в XAML, если C omponentModel:DesignerProperties.IsInDesignMode (xmlns:ComponentModel="clr-namespace:System.ComponentModel;assembly=PresentationFramework") является true того x:null, в противном случае создать свою виртуальную машину WpfApplication1:MyViewModel ??? Я много пробовал, но не смог найти правильное решение, но не могу поверить, что это невозможно. За любую идею (возможно, проверенный пример) заблаговременно.

ответ

0

Способ, которым я занимался в прошлом, включает в себя предоставление интерфейса для ваших моделей просмотра и представление представлений о своей модели просмотра из класса локатора viewmodel. Например, вы должны были бы следующие ViewModels:

public interface IMainViewModel 
{ 
    double Foo { get; } 
    double Bar { get; } 
} 

public class RealMainViewModel : IMainViewModel 
{ 
    // implementation of IMainViewModel, this one does your data access 
    // and is used at run time 
} 

public class FakeMainViewModel : IMainViewModel 
{ 
    // implementation of IMainViewModel, this one is fake 
    // and is used at design time 
} 

модели представления локатор будет выглядеть следующим образом:

public class ViewModelLocator 
{ 
    public static IMainViewModel MainViewModel 
    { 
     get 
     { 
      if (Designer.IsDesignMode) 
      { 
       return new FakeMainViewModel(); 
      } 
      else 
      { 
       return new RealMainViewModel(); 
      } 
     } 
    } 
} 

Наконец, вы будете включать в себя ссылку на ViewModelLocator в App.xaml:

<Application.Resources> 
    <ResourceDictionary> 
     <yourNamespace:ViewModelLocator x:Key="ViewModelLocator" /> 
    </ResourceDictionary> 
</Application.Resources> 

Таким образом, вы можете привязать к свойству ViewModel в ViewModelLocator и есть код сделать работу для введения реальной и поддельной ViewModel при необходимости:

<WpfApplication1:UserControl1 x:Name="UsrCtrl1" DataContext="{Binding Path=MainViewModel, Source={StaticResource ViewModelLocator}}"/> 

Я также нашел an article, что дает другой пример. Обратите внимание, что я написал этот код «на лету» в «Блокноте», поэтому извиняюсь, если есть какие-либо опечатки.

0

Я считаю, что вы можете использовать его в вашем UserControl1 тега, чтобы определить время разработки DataContext

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" 
d:DataContext="{x:Null}" 

Я на самом деле не тестировал, так как я обычно не использую окно дизайнера, но в теории он должен работать :)

Смежные вопросы