control wpf dependency-properties

control - WPF DependencyProperties



wpf controls (6)

Es una ventana en la que se establece.

public partial class Window1 : Window { public string Problem { get { return (string)GetValue(ProblemProperty); } set { SetValue(ProblemProperty, value); } } public static readonly DependencyProperty ProblemProperty = DependencyProperty.Register( "Problem", typeof(string), typeof(Window1)); public Window1() { InitializeComponent(); Problem = "ifowiof"; } public void OnClick(object sender, EventArgs e) { Problem = "behl"; } public void OnCancel(object sender, EventArgs e) { Problem = "eioeopje"; } }

XAML:

<Window x:Class="WpfToolTip.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <StackPanel> <Button Click="OnClick" Content="OK" /> <Button Click="OnCancel" Content="Cancel" /> <TextBlock Text="{Binding Path=Problem}" /> </StackPanel> </Window>

Funciona si configuro RelativeSource como dijo cuando se carga, pero si cambio la propiedad Problem en código manualmente (es decir, mediante un clic de botón) nunca actualiza el TextBlock con el nuevo valor.

Me acabo de dar cuenta de que he estado forzando las propiedades de vinculación / dependencia y no estoy realmente entendiendo el concepto de manera fundamental.

Aquí está la propiedad de dependencia:

public string Problem { get { return (string)GetValue(ProblemProperty); } set { SetValue(ProblemProperty, value); } } public static readonly DependencyProperty ProblemProperty = DependencyProperty.Register( "Problem", typeof(string), typeof(TextBox));

El XAML es así:

<TextBlock Text="{Binding Path=Problem}"/>

Estoy configurando manualmente la propiedad Problem en un valor en el constructor del objeto, pero no actualiza TextBlock consecuencia. . . ¿algunas ideas? Intenté Mode="OneWay" y Mode="TwoWay" en el enlace y todavía no funciona.

Pensé que se suponía que esto debería funcionar automáticamente? ¿O estoy fundamentalmente haciendo algo mal?

Gracias


Puede usar Enlace de nombre de elemento aquí, el elemento será la ventana en sí.

<Window x:Class="WpfToolTip.Window1" x:Name="_window" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <StackPanel> <Button Click="OnClick" Content="OK" /> <Button Click="OnCancel" Content="Cancel" /> <TextBlock Text="{Binding Path=Problem,ElementName=_window}" /> </StackPanel>


El problema que tienes definitivamente está relacionado con tu DataContext. La extensión {Binding} necesita saber dónde vive la propiedad a la que se está vinculando. La ubicación predeterminada que examina son los elementos DataContext que, de forma predeterminada, siempre se establece en el DataContext de su elemento principal. Si coloca el DataContext sobre el árbol lógico en la ventana primaria, The DataContext sería nulo (porque el DataContext de su ventana es nulo). Por lo tanto, su {Encuadernación} en su bloque de texto dice "Enlazar mi propiedad de texto a la propiedad de problema de mi DataContext ... que es nulo.

Hay un par de formas de resolver esto. Una sería hacer exactamente como lo mencionó Jobi y establecer que la propiedad Element de usted sea vinculante para apuntar a la ventana donde DependencyProperty se define así:

<TextBlock Text="{Binding Path=Problem,ElementName=_window}" />

Otra opción sería establecer el DataContext de su ventana para que apunte a sí mismo. De esta forma, todos los elementos contenidos en su contenido tendrán el DataContext de la ventana.

<Window .... DataContext="{Binding RelativeSource={RelativeSource Self}}">

Ahora, cada vez que necesite enlazar a propiedades definidas en la ventana (como su propiedad de dependencia Problema), puede hacer esto:

<TextBlock Text="{Binding Problem}" />


En su código, registra la Propiedad de dependencia para la clase TextBox (última línea de cotización).

public static readonly DependencyProperty ProblemProperty =
DependencyProperty.Register (
"Problema",
typeof (cadena),
typeof (TextBox));

Por lo tanto, puede establecer un valor para ProblemProperty solo para cuadros de texto, pero no puedo encontrar ningún cuadro de texto en ninguno de los fragmentos de código. Debe registrar su propiedad de dependencia para el tipo, al cual se le asignará el valor, de su muestra, la opción correcta no es obvia para mí. Podría, como lo hace Micah, definirlo como un DP de la ventana, luego establecer la propiedad en su ventana instanciada. O puede definirlo a cualquier objeto de dependencia con nombre dentro de la ventana, es decir, algún objeto con Name = m_ContentElement, y luego establecer su enlace a
{Binding ElementName=m_ContentElement, Path=Problem}
o más corto:
{Binding Problem, ElementName=m_ContentElement}


Hay dos formas de entender la razón del problema que describió.

Al principio, debe intentar establecer el controlador de propiedad modificado (en la declaración de propiedad de dependencia) y colocar allí el punto de interrupción. Verá si su propiedad está cambiando o no.

En segundo lugar, debe verificar el tipo de propietario de la propiedad de la dependencia.

¿Podrías mostrar xaml y codebehind completos?


prueba el tipo de typeof(object) lugar de typeof(string) .