caliburn.micro, как загрузить и связать представление для времени выполнения модели представления - PullRequest
1 голос
/ 10 октября 2011

Я создаю приложение, которое требует поддержки тем.Поэтому я хочу указать время выполнения папки views.

public class AppBootstrapper : Bootstrapper<IShell>
{
    CompositionContainer _container;

    /// <summary>
    /// By default, we are configure to use MEF
    /// </summary>
    protected override void Configure()
    {
         //view locator code get views from file and and binding it to viewmodel run time.
    }
}

Ответы [ 2 ]

4 голосов
/ 11 января 2012

Лучше было бы использовать этот твик (реализованный в Caliburn, но не Micro).http://caliburnmicro.codeplex.com/discussions/265502

Прежде всего вам необходимо определить атрибут, используемый для хранения соответствующих данных, используемых для обнаружения представления:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)]
public class ViewAttribute : Attribute
{
    public object Context { get; set; }

    public Type ViewType { get; private set; }

    public ViewAttribute(Type viewType)
    {
        ViewType = viewType;
    }
}

Присоедините его к вашей модели представления.

[View(typeof(MyView))]
public class MyViewModel : Screen

Затем вам нужно изменить LocateTypeForModelType в вашем загрузчике на что-то вроде этого:

void Initialize()
{
    var baseLocate = ViewLocator.LocateTypeForModelType;

    ViewLocator.LocateTypeForModelType = (modelType, displayLocation, context) =>
    {
        var attribute = modelType.GetCustomAttributes(typeof(ViewAttribute), false).OfType<ViewAttribute>().Where(x => x.Context == context).FirstOrDefault();
        return attribute != null ? attribute.ViewType : baseLocate(modelType, displayLocation, context);
    };
}
3 голосов
/ 15 октября 2011

В Caliburn вы можете создать настроенный IConventionManager или настроить реализацию (DefaultConventionManager), чтобы изменить способ, которым платформа находит папку View во время выполнения.

Фактически представления не обязательно должны находиться в папке Views, и вы можете изменить это поведение по умолчанию, так как это просто соглашение по умолчанию. Лучший способ реализовать этот интерфейс - проверить реализацию по умолчанию.

...