c# wpf xaml data-binding indexing

c# - ¿Cómo puede un enlace WPF distinguir entre una propiedad de indexador y un elemento de lista?



xaml data-binding (2)

Tengo un enlace del formulario:

Path=SpecialCollection[0]

La clase SpecialCollection extiende ObservableCollection y tiene una propiedad indexer.

public T this[string propertyValue] { get { // do stuff return default(T); } }

Mi problema es que el enlace intenta obtener el valor de la propiedad del indexador, en lugar de devolver el 0 ° elemento en la colección. ¿Hay alguna manera de obligar a la vinculación a tratar 0 como un número entero para que devuelva un elemento de recopilación, en lugar de invocar el captador de la propiedad del indizador de la colección?


En realidad, tiene dos propiedades del indexador, una que toma un argumento int y otra que toma un argumento de string . Francamente, no sé cómo la expresión de enlace elige qué indexador usar cuando es ambiguo. Si solo hay uno, puede forzar al índice al tipo de argumento del indexador. Si hay dos, puede lanzar una excepción o elegir una según una heurística. En este caso, aparentemente eligió el equivocado.

Para resolver este problema, puede mover su indexador de cadenas "hacia abajo un nivel" para que cuelgue de una propiedad nueva para que no compita con el indexador de listas o si todo lo que necesita es List[0] , puede agregar una First propiedad y eludir indexer.


Según MSDN , puede indicarle al enlace el tipo del valor ingresado como índice:

Dentro de los indexadores puede tener múltiples parámetros del indexador separados por comas (,). El tipo de cada parámetro se puede especificar con paréntesis. Por ejemplo, puede tener Path = "[(sys: Int32) 42, (sys: Int32) 24]", donde sys se asigna al espacio de nombres del sistema.

Noté que el constructor de Binding toma una cadena de ruta utiliza otro constructor de PropertyPath que el convertidor de tipo PropertyPath predeterminado, dicho constructor de PropertyPath no funciona en este escenario. Para evitar el problema, evite el constructor de Binding estableciendo manualmente la propiedad de Path que invoca la conversión a través del convertidor de tipo.

<!-- Does not work --> <TextBlock Text="{Binding [(sys:Int32)0]}"/> <!-- Does work --> <TextBlock Text="{Binding Path=[(sys:Int32)0]}"/>