/ / ¿Por qué DependencyProperty anula el comportamiento normal de enlace de propiedad? - wpf, vinculante

¿Por qué DependencyProperty anula el comportamiento de enlace de propiedad normal? - wpf, vinculante

De vez en cuando me encontré con un problema. Aquí hay un ejemplo simple:

Código XAML:

<Window x:Class="WPFProperties.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
x:Name="root">
<Grid>
<TextBox Text="{Binding Text,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,ElementName=root}"/>
</Grid>
</Window>

Código detrás:

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}

//// Using a DependencyProperty as the backing store for Text.  This enables animation, styling, binding, etc...
//public static readonly DependencyProperty TextProperty =
//    DependencyProperty.Register("Text", typeof(string), typeof(MainWindow), new UIPropertyMetadata(null));

private string _text;

public string Text
{
get { return _text; }
set
{
if (this._text == value) return;
_text = value;

this.DoSomething();
}
}

private void DoSomething()
{
// Do Someting
}
}

El método DoSomething () se puede invocar al escribir en el cuadro de texto. pero, una vez que elimine el comentario de la propiedad de dependencia "Texto", nunca se llamará.

Nota: Conozco el uso básico de la propiedad de dependencia.

Respuestas

2 para la respuesta № 1

necesitas crear UIPropertyMetaData condevolución de llamada (PropertyChangedCallback propertyChangedCallback) que debe ser un método estático dentro del cual debe llamar a la propiedad de actualización al pasar DependancyObject

el ejemplo se explica aquí: MSDN


2 para la respuesta № 2

Bueno, AFAIK no hay una declaración de propiedad normal que ocurra aquí ya que cuando un DP se declara es "s static que se inicializa desde el principio, incluso antes de que se creen los objetos normales y tenga prioridad.

Por lo tanto, la propiedad de la clase se trata simplemente como una propiedad de ayudante de DP normal en lugar de lo que parece ser una nueva propiedad de miembro de clase. Así, los internos de enlace solo utilizan el interno SetValue(...) o GetValue(...) directamente evitando su anulación, que es el comportamiento normal de un DP.

Cuando no se declara ningún DP, esto se convierte en una propiedad normal de la clase y en el turno vemos su DoSomething() llamado.

Nuevamente incluso con la definición de DP no comentada si llamamos Text = "Anything" en el constructor de MainWindow podemos ver DoDomething() invocado ya que esa es la forma en que funciona el DP donde se llama a su ayudante local. Sólo el enlace "s usa la definición base" s