Me resulta difícil vincular una propiedad de cadena estática simple a un cuadro de texto.
Aquí está la clase con la propiedad estática:
public class VersionManager
{
private static string filterString;
public static string FilterString
{
get { return filterString; }
set { filterString = value; }
}
}
En mi xaml, solo quiero vincular esta propiedad estática a un TextBox:
<TextBox>
<TextBox.Text>
<Binding Source="{x:Static local:VersionManager.FilterString}"/>
</TextBox.Text>
</TextBox>
Todo se compila, pero en tiempo de ejecución, obtengo la siguiente excepción:
No se puede convertir el valor en el atributo 'Fuente' al objeto de tipo 'System.Windows.Markup.StaticExtension'. Error en el objeto 'System.Windows.Data.Binding' en el archivo de marcado 'BurnDisk; componente / selectversionpagefunction.xaml' Línea 57 Posición 29.
¿Alguna idea de lo que estoy haciendo mal?
fuente
No puedes unirte a una estática como esa. No hay forma de que la infraestructura de enlace reciba notificaciones de actualizaciones ya que no hay
DependencyObject
(o instancia de objeto que implementeINotifyPropertyChanged
) involucrada.Si ese valor no cambia, simplemente abandone el enlace y úselo
x:Static
directamente dentro de laText
propiedad. Defina aapp
continuación la ubicación del espacio de nombres (y ensamblaje) de la clase VersionManager.Si el valor cambia, sugeriría crear un singleton para contener el valor y enlazarlo.
Un ejemplo del singleton:
fuente
En .NET 4.5 es posible enlazar a propiedades estáticas, leer más
fuente
A partir de WPF 4.5, puede enlazar directamente a propiedades estáticas y hacer que el enlace se actualice automáticamente cuando se cambia su propiedad. Es necesario cablear manualmente un evento de cambio para activar las actualizaciones de enlace.
Ahora puede vincular su propiedad estática como cualquier otra:
fuente
VersionManager
clase puede ser estática y todo sigue funcionando. Tenga en cuenta las llaves en la definición de rutaPath=(local:VersionManager.FilterString)
. ¿Alguien sabe por qué son realmente necesarios?Podría haber dos formas / sintaxis para vincular una
static
propiedad. Si p es unastatic
propiedad en claseMainWindow
, entoncesbinding
fortextbox
será:1)
2)
fuente
Puedes usar la
ObjectDataProvider
clase y esMethodName
propiedad. Puede verse así:El proveedor de datos de objetos declarados se puede usar así:
fuente
Si está utilizando recursos locales, puede consultarlos de la siguiente manera:
fuente
Variante correcta para .NET 4.5 +
Código C #
Enlace XAML (atención a las llaves son (), no {})
fuente
Mire mi proyecto CalcBinding , que le proporciona escribir expresiones complejas en el valor de la propiedad Path, incluidas las propiedades estáticas, las propiedades de origen, las matemáticas y otras. Entonces, puedes escribir esto:
¡Buena suerte!
fuente
Todas estas respuestas son buenas si quiere seguir buenas convenciones pero el OP quería algo simple , que es lo que yo también quería en lugar de tratar con patrones de diseño de GUI. Si todo lo que desea hacer es tener una cadena en una aplicación GUI básica que puede actualizar ad-hoc sin nada sofisticado, puede acceder directamente a ella en su fuente C #.
Digamos que tienes una aplicación WPF realmente básica MainWindow XAML como esta,
Eso se verá más o menos así:
En la fuente de su MainWindow XAML, podría tener algo como esto en todo lo que estamos haciendo para cambiar el valor directamente a través de
textBlock.Text
'sget
/set
funcionalidad:Luego, cuando active ese evento de clic haciendo clic en el botón, ¡listo! Kilroy aparece :)
fuente
Otra solución es crear una clase normal que implemente PropertyChanger como este
Luego cree una instancia estática de la clase en algún lugar que no desee
Y ahora úsalo como propiedad estática
Y aquí está la implementación de PropertyChanger si es necesario
fuente
Respuesta más eficaz (.net 4.5 y posterior):
y XAML:
No descuides los corchetes
fuente