2012-03-19 44 views
35

Tengo algunos problemas con un enlace WPF a una propiedad estática. En mi aplicación hay una clase llamada Globals que contiene una propiedad estática a ThisAddIn. Este objeto me permite acceder a una propiedad de usuario que básicamente es lo que quiero usar en mi enlace. Por lo tanto, mi XAML se ve así:El valor StaticExtension no se puede resolver

<TextBlock Text="{Binding Path=User.Name 
        , Source={x:Static Member=s:Globals.ThisAddIn}}" /> 

El espacio de nombres s se declara en la parte superior por la línea siguiente:

xmlns:s="clr-namespace:ConsoleApplication16.Model" 

me encontré con un montón de diferentes enfoques de cómo hacer referencia a la Propiedad estática en XAML, pero ninguna de ellas funcionó excepto esta, que también parece ser la más lógica para mí. Algunas muestras que encontré, no usaron Path o Member en absoluto.

Después de algunas pruebas, encontré la manera correcta de hacerlo, está usando "x: Static Member" para definir la clase y la propiedad estática que desea usar, mientras que Path define las propiedades correctas dentro de este objeto, como unión normal haría.

Aunque esta solución se compila sin ningún tipo de queja, aparece XAMLParseException directamente diciéndome que el valor StaticExtension no se puede resolver en una enumeración, campo estático o propiedad estática.

+1

Cómo exactamente es que el 'way' bien si se produce una excepción? –

+0

También debería poder descartar 'Path =' y 'Member =' porque eso invocará los contructors respectivos que establecen las propiedades relevantes. –

+0

Normalmente me uno a clases/propiedades estáticas usando '{Binding Source = {x: Static local: MyStaticClass.SomeStaticProperty.PropertyName}'. Solo asegúrese de que sus propiedades tengan evaluadores 'get' /' set'. Por ejemplo, asegúrese de usar 'public string PropertyName {get; conjunto; } 'en lugar de' public string PropertyName; ' – Rachel

Respuesta

63

Ensure Globals.ThisAddIn es público. También puede obtener esto si está utilizando un archivo de recursos, en cuyo caso también debe asegurarse de que el modificador de acceso esté configurado como público.

+7

¡Eso es todo! No tenía sentido que en el momento del diseño el valor de la propiedad se estableciera correctamente, entonces en el tiempo de ejecución falla con esta excepción. Muy confuso. – Steztric

+1

Holy moly, ¡tienes razón! Nunca hubiera soñado que el diseñador de código podría acceder a mis recursos en el momento del diseño, mientras que la compilación fallaría con "ExtensionValue no se puede resolver", lo mismo que lo que escribe @Steztric. ¡Muchas gracias! – Informagic

+1

Vine aquí porque mi archivo resx tenía un modificador interno. Cámbielo a público y funciona Y lo mismo, en el momento del diseño funcionó, veeeery confuso –

7

En el proyecto de biblioteca de salida, debe asegurarse de que el generador del archivo Resources.resx se haya modificado como PublicResXFileCodeGenerator en lugar de ResXFileGodeGenerator de manera predeterminada.

Reemplazar siguiente con ...

Not public resource

Éste

correct public resource

Cuestiones relacionadas