2008-11-25 8 views
6

Me acabo de dar cuenta de que he estado forzando las propiedades de unión/dependencia y no estoy realmente entendiendo el concepto.WPF DependencyProperties

Heres 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 tan así:

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

Estoy configurando manualmente la propiedad Problem a un valor en el constructor del objeto, sino que doesn' t actualice el TextBlock en 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

+0

Todo se ve bien para mí. Tiene que ser tu 'DataContext'. ¿Cómo lo estás configurando? –

Respuesta

11

El problema que tiene definitivamente está relacionado con su 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 al problema de la propiedad de mi DataContext ... que es nulo.

Hay un par de maneras de resolver esto. Una sería hacer como Jobi mencionado y establecer la propiedad Elemento de que te liga a apuntar a la ventana, donde la propiedad de dependencia se define así:.

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

Otra opción sería la de establecer el DataContext de la ventana para apuntar a sí mismo esa manera todo el los elementos contenidos en su contenido tendrán el DataContext de la ventana.

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

Ahora cada vez que necesite a la unión a las propiedades definidas en la ventana (como su propiedad de dependencia Problema), entonces usted puede hacer esto:

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

La solución para configurar el contexto de datos de la ventana en sí misma no me funciona. Solo funciona cuando configuro el contexto de datos de un elemento con un nivel más bajo o más (la primera cuadrícula funciona) en la ventana. ¿Se espera esto? – Erik83

0

Es una ventana se establece en

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> 

Se funciona si configuro el RelativeSource como lo dices 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.

+0

¿Alguna vez encontró una respuesta a esto? Estoy teniendo un problema similar. Parece que el enlace se pierde cuando establece la propiedad del problema. No estoy seguro de cuál es el procedimiento correcto para actualizar el valor de esta manera. –

2

Puede usar Enlace 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> 

0

En el código se registra la propiedad de dependencia para el cuadro de texto de clase (última línea de la cita).

sólo lectura estática pública DependencyProperty ProblemProperty =
DependencyProperty.Register (
"problema",
typeof (cadena),
typeof (Cuadro de texto));

lo que puede establecer un valor para el ProblemProperty sólo para cuadros de texto, pero no puedo encontrar ningún cuadro de texto en cualquiera de los fragmentos de código. Debe registrar su propiedad de dependencia para el tipo, al que se le asignará el valor, de su muestra, la elecció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 se podría definir a cualquier objeto de dependencia llamada dentro de la ventana, es decir, un objeto con nombre = m_ContentElement, a continuación, establezca su unión a
{Binding ElementName=m_ContentElement, Path=Problem}
o más corto:
{Binding Problem, ElementName=m_ContentElement}

0

Hay dos maneras de entender la razón del problema que describes

Primero, intente establecer el controlador de propiedad modificado (en declaración de propiedad de dependencia) y coloque 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ía mostrar por completo xaml y codebehind?

2

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