¿Cómo forzar la actualización de un enlace WPF?


112

Tengo un cuadro combinado con la fuente de los elementos adjunta mediante un enlace simple. ¿Hay alguna forma de actualizar este enlace una vez que se carga el cuadro combinado?


1
¿Qué quiere decir con enlace simple? Normalmente, cuando utiliza el enlace, el control debería actualizarse automáticamente.
Erno

12
Techee, no te ofendas, pero creo que HB merece que se acepte su respuesta ;-)
Dani

1
@Dani No estoy seguro de que Techee vuelva alguna vez, seis años y medio desde que inició sesión
The Lonely Coder

Respuestas:


198

Puede usar expresiones vinculantes:

private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
    ((ComboBox)sender).GetBindingExpression(ComboBox.ItemsSourceProperty)
                      .UpdateTarget();
}

Pero como señaló Blindmeis , también puede disparar notificaciones de cambio, además, si su colección implementa INotifyCollectionChanged(por ejemplo, implementada en ObservableCollection<T>), se sincronizará, por lo que no necesita hacer nada de esto.


No parece hacer nada por mí usando un ListBox.
Jonathan Wood

@JonathanWood: Bueno, no puedo adivinar qué tipo de código tiene, incluido el aspecto de su enlace. ¿Funciona la encuadernación en primer lugar?
HB

56

si usa mvvm y su itemsource se encuentra en su vm. simplemente llame a INotifyPropertyChanged para la propiedad de su colección cuando desee actualizar.

OnPropertyChanged("YourCollectionProperty");

7
Este es el enfoque más limpio en mi humilde opinión.
Ash

Esto debe hacerse siempre que sea posible, pero debe tenerse en cuenta que no siempre es práctico. Por ejemplo, si está enlazando a un puerto serie y desea verificar si está abierto, cerrado, la velocidad en baudios, etc., puede crear una clase contenedora alrededor del puerto serie que implementa INotifyPropertyChanged, pero tendrá que mantener el puerto privado para ese contenedor y, por lo tanto, debe escribir una propiedad y un método para todo en ese puerto que usa en otra parte del proyecto para asegurarse de que las propiedades que le interesa notificar siempre pasen por el contenedor
Assimilater

8
Además, soy un gran fanático del uso nameof(YourCollectionProperty)en lugar de una cadena literal. Esto evita que los errores se refactoricen y es más explícito lo que realmente se pretende. Aquí es, por supuesto, donde no puede usar el CallerMemberNameatributo, que es aún mejor
Asimilador

31

Para agregar mis 2 centavos, si desea actualizar su fuente de datos con el nuevo valor de su Control, debe llamar en UpdateSource()lugar de UpdateTarget():

((TextBox)sender).GetBindingExpression(ComboBox.TextProperty).UpdateSource();

1
Me gusta más esta respuesta.
Chopnut

8

Versión compatible con MultiBinding ...

private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
    BindingOperations.GetBindingExpressionBase((ComboBox)sender, ComboBox.ItemsSourceProperty).UpdateTarget();
}


0

Estaba obteniendo datos del backend y actualicé la pantalla con solo una línea de código. Funcionó. No estoy seguro de por qué necesitamos implementar Interface. (Windows 10, UWP)

    private void populateInCurrentScreen()
    {
        (this.FindName("Dets") as Grid).Visibility = Visibility.Visible;
        this.Bindings.Update();
    }

This.Bindings.update () actualiza todos los enlaces en la pantalla. FYI
Itzdsp

Intenté this.Bindings.Update () en un control de usuario en UWP y no existe.
James Esh

Si. Y esto Los enlaces todavía no existen.
James Esh

2
Bindings.Update () solo está disponible cuando se utilizan los enlaces compilados (x: Bind) ... y los enlaces compilados solo están disponibles en UWP
Marian Dolinský

Por favor, eche un vistazo al comentario de @ MarianDolinský. Parece que tienes que enlazar desde xaml
Itzdsp
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.