2011-04-21 17 views
6

Tengo una unión de la forma:¿Cómo se puede distinguir un enlace WPF entre una propiedad del indexador y un elemento de lista?

clase
Path=SpecialCollection[0] 

El SpecialCollection extiende ObservableCollection y tiene una propiedad de indizador.

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

Mi problema es que los intentos de unión para obtener el valor de la propiedad paso a paso, en lugar de devolver el artículo 0 ª 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?

+0

Obviamente, si utiliza un indexador, se llamará al indexador real. ¿Qué estás haciendo exactamente allí de todos modos si devuelve 'default (T)', quiero decir, wth? ¿Es realmente necesario sobrecargar el indexador para eso? –

+0

@ H.B. Notarás el comentario 'do stuff' que agregué, que intenté abstraer los detalles. FWIW, esta clase de colección particular nos permite buscar el primer artículo que tiene una propiedad cuyo valor coincide con propertyValue. Si va a proponer que no hagamos esto, son algunas cosas heredadas que no van a cambiar, de ahí mi deseo de solucionarlo. – Craig

+0

Conocía el 'DoStuff', pero creo que un indexador, como su nombre lo indica, solo debe usarse para acceder a los elementos a través de algún tipo de índice. (return default (T) después de que cualquier tipo de operación no coincida con eso) –

Respuesta

14

According to MSDN que puede decir la unión del tipo del valor introducido como índice:

indexadores su interior se pueden tener múltiples parámetros 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.

me di cuenta de que el Binding constructor taking a path string utiliza otra PropertyPath constructor que el convertidor de tipos por defecto PropertyPath, dijo PropertyPath constructor hace no trabajo en este escenario. Para evitar el problema, evite el constructor Binding estableciendo manualmente la propiedad Path que invoca la conversión mediante el convertidor de tipo.

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

Hermoso, gracias. Recuerdo haber visto este tiempo atrás, pero no podía recordar qué implicaba. – Craig

+0

@ Craig: Es desafortunado que esté mezclado en la referencia de índices múltiples, tal vez esa sea la razón por la que no lo volví a ver cuando hizo esta pregunta. –

1

Actualmente tiene dos propiedades de indexador, una que toma un argumento int y una que toma un argumento 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 lista o si todo lo que necesita es List[0] puede agregar un First propiedad y eludir indexer.

+0

Terminé estableciéndome en este enfoque. Resultó que necesitaba acceder a los índices 0 a 2, por lo que las propiedades de envoltura resultaron ser el mejor enfoque. Podría haber jurado que una vez leí acerca de una forma de lanzar el indexador a int. – Craig

+0

O tenga su indexador de cadenas lo suficientemente inteligente como para reconocer una cadena puramente numérica y convertirla para el otro indexador: ** es (la clave es puramente numérica) devuelva esto [Int32.Parse (clave)]; ** –

Cuestiones relacionadas