2010-02-01 11 views
11

He oído mucho sobre enlaces bidireccionales en WPF, pero no estoy del todo claro sobre cómo lograrlo o lo que realmente significa.¿Cómo se realiza el enlace de datos bidireccional en WPF?

Tengo un ListView con un montón de artículos en él. Cuando el usuario selecciona un nuevo elemento, TextBox en la aplicación cambiará su texto para mostrar alguna propiedad del elemento seleccionado.

Pero cuando el usuario cambia el texto en el cuadro de texto, también quiero que el elemento ListView se actualice inmediatamente. ¿Hay alguna forma WPF mágica "vinculante de dos vías" para lograr esto?

Respuesta

11

Si no está usted tendrá que poner en práctica INotifyPropertyChanged para su clase que está uniéndose a.

Además, cuando dice que desea que el elemento ListBox se actualice inmediatamente, quiere decir que desea que cambie a medida que escribe en TextBox. Por defecto, la propiedad TextBox.Text actualiza su fuente cuando se pierde el foco, pero esto se puede cambiar mediante el establecimiento de la unión UpdateSourceTrigger a PropertyChanged:

{Binding Source={...}, Path=Whatever, UpdateSourceTrigger=PropertyChanged} 
+3

Dependiendo de cómo haya configurado las cosas, puede ser necesario cambiar esa Fuente a ElementName (con una Ruta de SelectedItem.Whatever) o, si el conjunto de elementos vinculados es DataContext, puede omitirse, pero en este último caso ListView necesitará IsSynchronizedWithCurrentItem = "True". – itowlson

+0

Es como dice itowlson. ¡Muchas gracias! –

+0

Ahh cierto, y gracias por corregir la sintaxis;) –

1

¿Cuál es el tipo de elementos en el ListView? Para obtener los dos vinculante ir la necesidad de implementar INotifyPropertyChanged manera ...

Esto podría ayudar a WPF event property changed?

+0

Los elementos en la vista de lista son objetos que implementan 'INotifyPropertyChanged'. –

+0

¿Tiene una muestra de cómo se ve su código? – anthonyv

33

Mark's answer muestra cómo llevar a cabo lo que quiere, pero también se preguntó de manera más general sobre " cómo lograr [enlace bidireccional] y lo que realmente significa ".

Encuadernación unidireccional significa que el objetivo de encuadernación (por ejemplo, control) mostrará datos de la fuente de encuadernación (por ejemplo, objeto comercial) y se actualizará a medida que el objeto comercial cambie, pero los cambios en el control no se propagarán volver al objeto comercial. P.ej. si Person.Name cambia de "bob" a "kate", TextBlock.Text vinculado al nombre también cambiará de "bob" a "kate".

La vinculación bidireccional simplemente significa que no solo se reflejan los cambios en el objeto comercial en la interfaz de usuario, sino que los cambios realizados por el usuario en la interfaz de usuario también se propagan al objeto comercial. Así que ahora, cuando el usuario edite el TextBox.Text vinculado al Nombre, digamos cambiando "kate" por "edmund", WPF también configurará la propiedad Person.Name como "edmund".

Para lograr esto, simplemente configure Modo = TwoWay en la declaración de enlace. Algunas propiedades se unen de manera bidireccional: TextBox.Text, por ejemplo, vincula a TwoWay de manera predeterminada, por lo que el código de Mark no necesita la declaración de modo. Además, como señala Mark, de manera predeterminada, WPF solo propaga los cambios al objeto comercial cuando el control pierde el foco. Si tiene dos elementos de UI vinculados a la misma propiedad, esto puede significar que no están sincronizados, en cuyo caso puede usar UpdateSourceTrigger para forzar a WPF a propagarse cada vez que cambie la propiedad.

MSDN cubre esto en detalle con algunos buenos diagramas claros: vea Data Binding Overview en el WPF SDK.

+1

Bonita descripción de la vinculación. =) –

+0

Votó arriba. Pasé por una tonelada de resultados de búsqueda que describieron cómo implementar el enlace de datos bidireccional, pero ninguno que explicara el concepto. Tu publicación fue muy sucinta. –

+0

Gracias por esto, especialmente la frase "Algunas propiedades se unen de dos maneras por defecto: TextBox.Text, por ejemplo, vincula TwoWay por defecto" Esto ayudó enormemente :) – sergeantKK

Cuestiones relacionadas