j'ai écrit un ViewModel très simple Locator:Puis-je obtenir mon blendability retour
public static readonly DependencyProperty LocateForProperty =
DependencyProperty.RegisterAttached("LocateFor",
typeof (Object),
typeof (ViewModelLocator),
new PropertyMetadata(null, OnLocateForChanged));
public static object GetLocateFor(DependencyObject dependencyObject)
{
return dependencyObject.GetValue(LocateForProperty);
}
public static void SetLocateFor(DependencyObject dependencyObject, Object value)
{
dependencyObject.SetValue(LocateForProperty, value);
}
private static void OnLocateForChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs eventArgs)
{
if (dependencyObject != null)
{
var viewModelName = dependencyObject.GetType().AssemblyQualifiedName;
if (! string.IsNullOrEmpty(viewModelName))
{
viewModelName = viewModelName.Replace("View", "ViewModel");
var viewModel = DependencyLocator.GetInstance(Type.GetType(viewModelName));
if (viewModel != null)
{
((FrameworkElement) dependencyObject).DataContext = viewModel;
}
}
}
}
et de l'utiliser comme ceci:
<vm:ViewModelLocator.LocateFor>
<Binding RelativeSource="{RelativeSource Self}" />
</vm:ViewModelLocator.LocateFor>
Il fonctionne parfaitement à l'exécution, mais j'ai perdu l'emplacement de la conception. Je suppose que c'est parce que j'utilise la liaison relative, j'ai essayé de le changer à x:Static
mais cela ne fonctionne pas. Y a-t-il des changements suggérés que je pourrais faire qui me redonneraient Blendability?
EDIT: A propos DependencyLocator, il est une enveloppe statique autour Ninject:
using System;
using System.Collections.Generic;
/// <summary>
/// Defines an object that wraps around specific DI containers.
/// </summary>
public static class DependencyLocator
{
/// <summary>
/// Gets or Sets the function used for locating a single instance of a specifc type.
/// </summary>
public static Func<Type, object> GetInstance;
/// <summary>
/// Gets or Sets the function used for locating all instance of a specific type.
/// </summary>
public static Func<Type, IEnumerable<object>> GetAllInstances;
/// <summary>
/// Gets the implementation of the provided service.
/// </summary>
public static T Get<T>()
{
return (T)GetInstance(typeof(T));
}
/// <summary>
/// Gets all implementations of the provided service.
/// </summary>
public static IEnumerable<T> GetAll<T>()
{
return (IEnumerable<T>) GetAllInstances(typeof (T));
}
}
qui obtient peuplé dans une classe app_start dans app.xaml. Il a été conçu de cette manière pour la conception et si je crée une classe de localisateur de modèle simple utilisant un objet instancié défini dans le xaml de la vue, il obtient les valeurs correctes de DependencyLocator, c'est seulement depuis que je suis passé aux propriétés de dépendance. est venu.
Qu'est-ce que vous avez à DependencyLocator.GetInstance? utilisez-vous un framework DI/IoC là-dedans? ... si oui, lequel? –
@colinsmith J'ai ajouté une modification pour vous. – deanvmc
En supposant que j'imagine que votre Bootstrapper/Kernel Ninject ne soit pas appelé à DesignTimes, il n'y a pas de type de configuration qu'il peut injecter. Appelez-vous votre BootStrapper/kernel à l'exécution? –