2009-02-28 11 views
8

tengo tal código de enlace de WPF:OneWay paradas de unión a trabajar después de que el objetivo de actualizar manualmente

TestModel source = new TestModel(); 
TestModel target = new TestModel(); 

Bind(source, target, BindingMode.OneWay); 

source.Attribute = "1"; 
AssertAreEqual(target.Attribute, "1"); 

target.Attribute = "foo"; 

source.Attribute = "2"; 
AssertAreEqual(target.Attribute, "2"); 

La segunda afirmación falla! Esto me parece extraño.

Además, probé 'OneWayToSource' en lugar de 'OneWay', y todo funciona como se esperaba.

Bind(source, target, BindingMode.OneWayToSource); 

target.Attribute = "1"; 
AssertAreEqual(source.Attribute, "1"); 

source.Attribute = "foo"; 

target.Attribute = "2"; 
AssertAreEqual(source.Attribute, "2"); 

Otros detalles:

void Bind(TestModel source, TestModel target, BindingMode mode) 
{ 
    Binding binding = new Binding(); 
    binding.Source = source; 
    binding.Path = new PropertyPath(TestModel.AttributeProperty); 
    binding.Mode = mode; 
    BindingOperations.SetBinding(target, TestModel.AttributeProperty, binding); 
} 

class TestModel : DependencyObject 
{ 
    public static readonly DependencyProperty AttributeProperty = 
     DependencyProperty.Register("Attribute", typeof(string), typeof(TestModel), new PropertyMetadata(null)); 

    public string Attribute 
    { 
     get { return (string)GetValue(AttributeProperty); } 
     set { SetValue(AttributeProperty, value); } 
    } 
} 

Lo que está mal con mi código?

Respuesta

13

Configuración target.Attribute = "foo"; borró el enlace.

MSDN:

No sólo los recursos dinámicos y fijaciones funcionan a la misma precedencia como un valor local, que son en realidad un valor local, pero con un valor que se difiere. Una consecuencia de esto es que si usted tiene un recurso dinámico o vinculante en lugar para un valor de la propiedad, cualquier valor local que establezca posteriormente sustituye a la unión dinámica o vinculante en su totalidad. Incluso si llama al ClearValue para borrar el valor establecido localmente , el recurso dinámico o el enlace no se restaurarán. De hecho, si llama a ClearValue en una propiedad que tiene un recurso dinámico o vinculando en su lugar (sin un valor local "literal"), también se borran con la llamada de ClearValue llamando al .

1

No es un experto vinculante, pero creo que se está encontrando con un problema de precedencia de propiedad de dependencia de WPF. Es probable que establecer el valor directamente tenga prioridad sobre el valor de enlace. Es por eso que anula el enlace.

Aquí está una lista completa propiedad de dependencia: http://msdn.microsoft.com/en-us/library/ms743230.aspx

+0

Indica que el valor establecido a través del estilo anulará el valor de la plantilla, y el valor local anulará el valor del estilo, etc. Pero no tengo nada de esto. Así que no estoy seguro de que esto explique el problema ... Gracias de todos modos. – alex2k8

+0

Además, esto no explica la diferencia entre OneWay y OneWayToSource – alex2k8

-1

Si ajusta el modo de unión a OneWay, esto significa que las obras de unión de una sola manera: el objetivo es actualizado cuando el cambio de fuente.

Pero el destino debe ser una propiedad de dependencia, y el código que tiene es una propiedad CLR .NET. Debe establecer el valor en el destino utilizando el nombre de propiedad de dependencia registrada, no solo un nombre de propiedad .NET ordinario. La respuesta de Jared es correcta, esto podría generar confusión al resolver el conflicto entre la propiedad de dependencia de WPF y la propiedad CLR de .NET común.

Si sigue la convención, la propiedad de dependencia debe tener la forma de propiedad "propertyname" +.

Ejemplo: TextProperty es una propiedad de dependencia de "Texto" de TextBox. Llamando a estos en código debe ser:

TextBox1.TextProperty="value"; 

Para obtener más información sobre la configuración de la fuente de Encuadernación:

http://msdn.microsoft.com/en-us/library/ms743643.aspx

+0

Agregué el modelo de prueba para evitar confusiones ... También, por favor, consulte mi método de enlace: estoy usando la propiedad de depenecia de WPF. Yo uso el contenedor de propiedades CLR solo para establecer el valor de la propiedad WPF ... También, TextBox1.TextProperty = "value"; ¿Qué quieres decir? La instancia de TextBox solo tiene la propiedad Text. – alex2k8

0

Ejemplo: TextProperty es "texto" propiedad de dependencia del cuadro de texto. Llamar a estos en código debería ser:

TextBox1.TextProperty = "value";

propiedades WPF se pueden establecer de dos formas:. invocando método DependencyObject.SetValue (. Ej instance.SetValue (TextProperty, "algún texto")) o utilizando CLR Wrapper (por ejemplo instance.Text =" algún texto").

TextBox.TextProperty es un objeto DependencyProperty estático, por lo que no puede asignar un valor de cadena a un tipo de referencia.

Cuestiones relacionadas