Saltar al contenido

¿Cómo puedo vincular una propiedad xaml a una variable estática en otra clase?

Solución:

En primer lugar, no te puedes unir variable. Puedes unirte solo a properties desde XAML. Para vincularse a la propiedad estática, puede hacerlo de esta manera (digamos que desea vincular Text propiedad de TextBlock) –

<TextBlock Text="{Binding Source={x:Static local:YourClassName.PropertyName}}"/>

dónde local es el espacio de nombres donde reside su clase que debe declarar arriba en un archivo xaml como este –

xmlns:local="clr-namespace:YourNameSpace"

En realidad, no puede vincularse a una propiedad estática (INotifyPropertyChanged solo tiene sentido en instancias), por lo que esto debería ser suficiente …

{x:Static my:MyTestStaticClass.MyProperty}  

o por ejemplo

<TextBox Text="{x:Static my:MyTestStaticClass.MyProperty}" Width="500" Height="100" />  

asegúrese de incluir el namespace – es decir, definir el my en el XAML como xmlns:my="clr-namespace:MyNamespace"


EDITAR: enlace desde el código

(Hay algunas respuestas mixtas en esta parte, así que pensé que tenía sentido expandirlo, tenerlo en un solo lugar)


OneTime vinculante:

Podrías usar textBlock.Text = MyStaticClass.Left (solo tenga cuidado donde coloca eso, post-init)

TwoWay (o OneWayToSource) vinculante:

Binding binding = new Binding();
//binding.Source = typeof(MyStaticClass);
// System.InvalidOperationException: 'Binding.StaticSource cannot be set while using Binding.Source.'
binding.Path = new PropertyPath(typeof(MyStaticClass).GetProperty(nameof(MyStaticClass.Left)));
binding.Mode = BindingMode.TwoWay;
binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
this.SetBinding(Window.LeftProperty, binding);

… por supuesto, si está configurando Binding desde el código, elimine cualquier enlace en XAML.

OneWay (propiedad cambia de la fuente):

Y si necesita actualizar el objetivo (es decir, la propiedad del control, Window.Left en este caso) en los cambios de propiedad de origen, eso no se puede lograr con la clase estática (según mi comentario anterior, necesitaría los INotifyPropertyChanged implementado, por lo que podría usar una clase contenedora, implementar INotifyPropertyChanged y conecte eso a una propiedad estática de su interés (siempre que sepa cómo rastrear los cambios de su propiedad estática, es decir, esto es más un problema de ‘diseño’ a partir de este punto, sugeriría rediseñarlo y ponerlo todo dentro de uno ‘no -clase estática ‘).

Puedes usar el más nuevo x:Bind para hacer esto simplemente usando:

<TextBlock Text="{x:Bind YourClassName.PropertyName}"/>
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *