Как получить «ноль» от ObjectDataProvider в режиме разработки? - PullRequest
3 голосов
/ 12 августа 2011

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

<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 ???Я много пробовал, но не смог найти правильного решения, но не могу поверить, что это невозможно.За любую идею (может быть, проверенный пример) заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 12 августа 2011

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

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

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

0 голосов
/ 12 августа 2011

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

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}}"/>

Я также нашел статью , в которой приведен еще один пример. Обратите внимание, что я написал этот код на лету в блокноте, поэтому я прошу прощения, если есть какие-либо опечатки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...