c# - two - wpf binding types
UniĆ³n bidireccional en WPF (3)
No puedo obtener un enlace bidireccional en WPF para trabajar. Tengo una propiedad de cadena en la ventana principal de mi aplicación que está vinculada a un cuadro de texto (configuré el modo a "TwoWay"). La única vez que se actualizará el valor del cuadro de texto es cuando la ventana se inicializa. Cuando escribo en el cuadro de texto, el valor de las propiedades de la cadena subyacente no cambia. Cuando una fuente externa cambia el valor de la propiedad de la cadena (un evento en Click, por ejemplo, que simplemente restablece el valor del cuadro de texto), el cambio no se propaga al cuadro de texto.
¿Cuáles son los pasos que debo implementar para lograr que el enlace bidireccional funcione correctamente incluso en este ejemplo casi trivial?
(Puedo proporcionar el código si es realmente necesario. Estoy buscando más el proceso. Entiendo los conceptos básicos del enlace de datos, aunque soy muy nuevo en WPF).
Es posible que necesitemos ver el código. ¿Su propiedad de cadena provoca un evento PropertyChanged? O (incluso mejor) ¿está implementado como DependencyProperty? Si no, el TextBox encuadernado no sabrá cuándo cambia el valor.
En cuanto a escribir en el TextBox y no ver el cambio en el valor de la propiedad, puede deberse a que su TextBox no pierde el foco. De forma predeterminada, los cuadros de texto vinculados no vuelven a escribir sus valores en la propiedad fuente hasta que el foco deja el control. Intenta tabular y ver si cambia el valor de la propiedad.
Lo más probable es que intente vincularse a una propiedad CLR .net en lugar de a una propiedad WPF dependencyProperty (que proporciona notificación de cambio además de algunas otras cosas).
Para la propiedad CLR normal, debe implementar INotifyPropertyChanged y forzar la actualización en el cuadro de texto en el controlador de eventos para PropertyChanged.
- Así que haga que su objeto con la propiedad implemente esta interfaz, plantee el evento en el conjunto de propiedades. (Entonces ahora tenemos notificación de cambio de propiedad)
- Asegúrese de que el objeto esté configurado como la propiedad DataContext del elemento / control UI
Esto también me sorprendió cuando comencé a aprender sobre el enlace de datos de WPF.
Actualización: Bueno OP, habría sido una pérdida de tiempo si estuviera ladrando el árbol equivocado ... de todos modos ahora ya que tuvo que cavar un poco ... lo recordará por un largo tiempo. Aquí está el fragmento de código para redondear esta respuesta. También descubrí que la actualización del cuadro de texto ocurre automáticamente tan pronto como yo elimine el tabulador. Solo necesita suscribirse manualmente al evento y actualizar la interfaz de usuario si su objeto datacontext no es el que implementa INotifyPropertyChanged.
MyWindow.xaml
<Window x:Class="DataBinding.MyWindow" ...
Title="MyWindow" Height="300" Width="300">
<StackPanel x:Name="TopLevelContainer">
<TextBox x:Name="txtValue" Background="AliceBlue" Text="{Binding Path=MyDotNetProperty}" />
<TextBlock TextWrapping="Wrap">We''re twin blue boxes bound to the same property.</TextBlock>
<TextBox x:Name="txtValue2" Background="AliceBlue" Text="{Binding Path=MyDotNetProperty}" />
</StackPanel>
</Window>
MyWindow.xaml.cs
public partial class MyWindow : Window, INotifyPropertyChanged
{
public MyWindow()
{
InitializeComponent();
this.MyDotNetProperty = "Go ahead. Change my value.";
TopLevelContainer.DataContext = this;
}
private string m_sValue;
public string MyDotNetProperty
{
get { return m_sValue; }
set
{
m_sValue = value;
if (null != this.PropertyChanged)
{
PropertyChanged(this, new PropertyChangedEventArgs("MyDotNetProperty"));
}
}
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
Siento la necesidad de agregar algo de precisión:
El enlace de datos "de dos maneras" es más que un enlace de datos de "una sola vía".
El enlace de datos "unidireccional" es un enlace de una fuente a una propiedad dependiente. La fuente debe implementar INotifyProertyChanged, para obtener la propagación del cambio de la fuente al objetivo.
Para obtener el "modo 2", para obtener una propagación del objetivo a la fuente, depende del modo de enlace que establezca en el enlace. Si no establece ningún BindingMode para su enlace, se usará el modo de enlace predeterminado, y este modo predeterminado es una característica de su propiedad de dependencia de destino.
Ejemplo:
Un Textbox vinculado a una propiedad de cadena, llamado "MyTextProperty". En el código, vincula Textbox.Text DependencyProperty a "MyTextProperty" en el objeto "MyObject"
-> enlace de "unidireccional": el colocador de "My TextProperty" debe generar un evento Propiedad modificada, y "MyObject" debe implementar INotifyPropertyChanged.
-> "vinculación de datos de 2 maneras": además de lo que se necesita para "Una sola vía", bindingMode se debe establecer en "2 formas". En este caso especial, Text DependencyProperty para Textbox tiene "2 formas" como modo predeterminado, ¡así que no hay nada más que hacer!