Saturday, April 16, 2011

d:DesignInstance in WPF 4

Только что посмотрел сессию Deep Dive MVVM с прошедшей недавно конференции MIX11. Посмотрите видео. Гарантирую, что не пожалеете потраченного времени.

Я же сейчас хочу остановиться только на одном моменте. Когда-то я уже писал про то как можно организовать Blendability для ваших View. А вот из сегодняшнего видео узнал, что оказывается в WPF4 есть возможность организовать все несколько проще.

Я напомню, что я предлагал создавать отдельный класс ViewModel’и для design time. Привязка такой ViewModel’и ко View выглядела вот так:

<UserControl
    x:Class="ViewModelLocatorSample.EditTagView"
    ...
    d:DataContext="{Binding Source={StaticResource editVm}}">
    <UserControl.Resources>
        <vm:EditTagViewModelDesign x:Key="editVm" />
    </UserControl.Resources>
    ...
</UserControl>

Однако вот как можно сделать тоже самое проще:

<UserControl
    x:Class="ViewModelLocatorSample.EditTagView"
    ...
    d:DataContext="{d:DesignInstance Type=vm:EditTagViewModel,
        IsDesignTimeCreatable=True}">

Дизайнер сам создаст экземпляр ViewModel’и подтянет из нее данные. Тут есть только один маленький нюанс. Теперь наша единственная ViewModel’ь должна иметь конструктор без параметров (иначе дизайнер не сможет ее создать) и уметь инициализировать себя данными-заглушками. Примерно следующим образом:

internal sealed class EditTagViewModel
{
    public EditTagViewModel()
    {
        if (IsInDesignMode)
        {
            Tag = new TagInfo
            {
                Name = "DummyTag",
                Score = 99
            };
        }
    }
    ...
}

Исходные коды всех примеров показанных в видео, вы можете скачать здесь.