Si el indexador tiene un tipo específico de la conversión debe hacerse de forma automática por lo que este debería funcionar:
{Binding theDictionary[ns:OnePrettyType]}
Si necesita una interpretación explícita, puede intentar un "molde" como este:
{Binding theDictionary[(sys:Type)ns:OnePrettyType]}
(Donde sys
está mapeado en el espacio de nombres System
por supuesto)
Esa sería la teoría pero todo eso no funcionará. En primer lugar, si utiliza el constructor Binding
que toma una ruta, el molde se ignorará, ya que utiliza un determinado constructor de PropertyPath
de una determinada manera. También obtendrá un error de unión:
System.Windows.Data Error: 40 : BindingExpression path error: '[]' property not found on 'object' ''Dictionary`2'
Usted tendría que hacer construir el PropertyPath
a través del convertidor de tipos, al evitar la Binding
constructor:
{Binding Path=theDictionary[(sys:Type)ns:OnePrettyType]}
Ahora bien, esto lo más probable es simplemente una excepción :
{"Path indexer parameter has value that cannot be resolved to specified type: 'sys:Type'"}
Desafortunadamente, no hay ninguna conversión de tipo predeterminado en curso. Luego puede construir un PropertyPath
en XAML y asegurarse de que se ingrese un tipo, pero la clase no está destinada a usarse en XAML y arrojará una excepción si lo intenta, también muy desafortunado.
Una solución alternativa sería crear una extensión de marcado que realice la construcción, p.
[ContentProperty("Parameters")]
public class PathConstructor : MarkupExtension
{
public string Path { get; set; }
public IList Parameters { get; set; }
public PathConstructor()
{
Parameters = new List<object>();
}
public PathConstructor(string path, object p0)
{
Path = path;
Parameters = new[] { p0 };
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return new PropertyPath(Path, Parameters.Cast<object>().ToArray());
}
}
que luego puede ser utilizada como esto:
<Binding>
<Binding.Path>
<me:PathConstructor Path="theDictionary[(0)]">
<x:Type TypeName="ns:OnePrettyType" />
</me:PathConstructor>
</Binding.Path>
</Binding>
o como esta actualización
{Binding Path={me:PathConstructor theDictionary[(0)], {x:Type ns:OnePrettyType}}}
En lugar de enlazar al diccionario y algún otro valor, exponer una propiedad en el modelo de vista que hace el trabajo por usted. –