una significa que para img imagenes imagen etiquetas como atributos atributo agregar wpf xaml data-binding

wpf - para - que significa alt en una imagen



Enlace a la propiedad estática (8)

Tengo dificultades para 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 cuadro de texto:

<TextBox> <TextBox.Text> <Binding Source="{x:Static local:VersionManager.FilterString}"/> </TextBox.Text> </TextBox>

Todo 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?


A partir de WPF 4.5, puede vincularse directamente a propiedades estáticas y hacer que el enlace se actualice automáticamente cuando se cambie su propiedad. Necesitas conectar manualmente un evento de cambio para activar las actualizaciones de enlace.

public class VersionManager { private static String _filterString; /// <summary> /// A static property which you''d like to bind to /// </summary> public static String FilterString { get { return _filterString; } set { _filterString = value; // Raise a change event OnFilterStringChanged(EventArgs.Empty); } } // Declare a static event representing changes to your static property public static event EventHandler FilterStringChanged; // Raise the change event through this static method protected static void OnFilterStringChanged(EventArgs e) { EventHandler handler = FilterStringChanged; if (handler != null) { handler(null, e); } } static VersionManager() { // Set up an empty event handler FilterStringChanged += (sender, e) => { return; }; } }

Ahora puede vincular su propiedad estática como cualquier otra:

<TextBox Text="{Binding Path=(local:VersionManager.FilterString)}"/>


En .NET 4.5 es posible enlazar a propiedades estáticas, lea más

Puede usar propiedades estáticas como origen de un enlace de datos. El motor de enlace de datos reconoce cuándo cambia el valor de la propiedad si se genera un evento estático. Por ejemplo, si la clase SomeClass define una propiedad estática llamada MyProperty, SomeClass puede definir un evento estático que se genera cuando cambia el valor de MyProperty. El evento estático puede usar cualquiera de las siguientes firmas:

public static event EventHandler MyPropertyChanged; public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;

Tenga en cuenta que en el primer caso, la clase expone un evento estático denominado PropertyNameChanged que pasa EventArgs al controlador de eventos. En el segundo caso, la clase expone un evento estático llamado StaticPropertyChanged que pasa PropertyChangedEventArgs al controlador de eventos. Una clase que implementa la propiedad estática puede elegir enviar notificaciones de cambio de propiedad con cualquiera de los métodos.


Mira mi proyecto CalcBinding , que te proporciona la escritura de expresiones complejas en el valor de la propiedad Path, incluidas propiedades estáticas, propiedades de origen, matemáticas y otras. Entonces, puedes escribir esto:

<TextBox Text="{c:Binding local:VersionManager.FilterString}"/>

¡Buena suerte!


No se puede vincular a una estática como esa. No hay forma de que la infraestructura de enlace sea notificada de las actualizaciones ya que no hay ningún DependencyObject (o instancia de objeto que implemente INotifyPropertyChanged ).

Si ese valor no cambia, simplemente abandone el enlace y use x:Static directamente dentro de la propiedad Text . Defina la app continuación como la ubicación del espacio de nombres (y el ensamblaje) de la clase VersionManager.

<TextBox Text="{x:Static app:VersionManager.FilterString}" />

Si el valor cambia, sugiero crear un singleton para contener el valor y vincularlo.

Un ejemplo de singleton:

public class VersionManager : DependencyObject { public static readonly DependencyProperty FilterStringProperty = DependencyProperty.Register( "FilterString", typeof( string ), typeof( VersionManager ), new UIPropertyMetadata( "no version!" ) ); public string FilterString { get { return (string) GetValue( FilterStringProperty ); } set { SetValue( FilterStringProperty, value ); } } public static VersionManager Instance { get; private set; } static VersionManager() { Instance = new VersionManager(); } }

<TextBox Text="{Binding Source={x:Static local:VersionManager.Instance}, Path=FilterString}"/>


Podría haber dos formas / sintaxis para vincular una propiedad static . Si p es una propiedad static en la clase MainWindow , el binding para el textbox de textbox será:

1.

<TextBox Text="{x:Static local:MainWindow.p}" />

2.

<TextBox Text="{Binding Source={x:Static local:MainWindow.p},Mode=OneTime}" />


Puede usar la clase ObjectDataProvider y su propiedad MethodName . Puede verse así:

<Window.Resources> <ObjectDataProvider x:Key="versionManager" ObjectType="{x:Type VersionManager}" MethodName="get_FilterString"></ObjectDataProvider> </Window.Resources>

El proveedor de datos de objeto declarado se puede usar así:

<TextBox Text="{Binding Source={StaticResource versionManager}}" />


Si el enlace debe ser bidireccional, debe proporcionar una ruta. Hay un truco para hacer un enlace bidireccional en una propiedad estática, siempre que la clase no sea estática: declare una instancia ficticia de la clase en los recursos y utilícela como fuente del enlace.

<Window.Resources> <local:VersionManager x:Key="versionManager"/> </Window.Resources> ... <TextBox Text="{Binding Source={StaticResource versionManager}, Path=FilterString}"/>


Si está utilizando recursos locales, puede consultarlos de la siguiente manera:

<TextBlock Text="{Binding Source={x:Static prop:Resources.PerUnitOfMeasure}}" TextWrapping="Wrap" TextAlignment="Center"/>