2010-10-07 19 views
7

Enlace a una propiedad de dependencia es fácil en el código subyacente. Simplemente crea un nuevo objeto System.Windows.Data.Binding y luego llama al método SetBinding del objeto de dependencia de destino.Enlace de datos a la propiedad CLR en código subyacente

Pero, ¿cómo se hace esto cuando la propiedad que estamos vinculando es una propiedad CLR y no se puede proporcionar un argumento DependencyProperty al SetBinding?

EDIT: El objeto implementa INotifyPropertyChanged, si es relevante.

Respuesta

0

Si entiendo bien su pregunta tiene una FrameworkElement que expone una llanura antigua propiedad común que no está respaldada como una Propiedad de dependencia. Sin embargo, le gustaría establecerlo como el objetivo de un enlace.

Primero, es poco probable que funcione el enlace de TwoWay al trabajo, y en la mayoría de los casos es imposible. Sin embargo, si solo desea un enlace obligatorio, puede crear una propiedad adjunta como sustituto de la propiedad real.

Imaginemos que tengo un elemento de estructura StatusDisplay que tiene una propiedad de cadena Message que por alguna razón tonta no admite Message como propiedad de dependencia.

public static StatusDisplaySurrogates 
{ 
    public static string GetMessage(StatusDisplay element) 
    { 
     if (element == null) 
     { 
      throw new ArgumentNullException("element"); 
     } 
     return element.GetValue(MessageProperty) as string; 
    } 

    public static void SetMessage(StatusDisplay element, string value) 
    { 
     if (element == null) 
     { 
      throw new ArgumentNullException("element"); 
     } 
     element.SetValue(MessageProperty, value); 
    } 

    public static readonly DependencyProperty MessageProperty = 
     DependencyProperty.RegisterAttached(
      "Message", 
      typeof(string), 
      typeof(StatusDisplay), 
      new PropertyMetadata(null, OnMessagePropertyChanged)); 

    private static void OnMessagePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     StatusDisplay source = d as StatusDisplay; 
     source.Message = e.NewValue as String; 
    } 
} 

Por supuesto, si el control StatusDisplay tiene su propiedad Message modificado directamente por la razón que ya no coincidirá con el estado de este sustituto. Aún así, eso puede no ser importante para tus propósitos.

0

Espera. ¿Está intentando vincular 2 propiedades de CLR? Permítanme decir que tal cosa es imposible de lograr de manera normal. p.ej. ningún tipo de hack hardcore que pueda hacer que toda tu aplicación sea inestable. Un lado de la vinculación DEBE ser DependencyProperty. Período.

0

Puede vincular una propiedad CLR a DepenencyProperty en un control, por ejemplo. En este cae, la propiedad CLR es la FUENTE del enlace y DependencyProperty es el OBJETIVO del enlace. Para que funcione, la clase con la propiedad CLR debe implementar INotifyPropertyChanged.

Así es como lo hace en el código subyacente:

Binding canModifyBinding = new Binding(); 
canModifyBinding.Source = LastRecord; 
canModifyBinding.Path = new PropertyPath("CanModify"); 
BindingOperations.SetBinding(this, CanModifyProperty, canModifyBinding); 

En este caso, el objeto Binding representa la información acerca de la Fuente: ¿Qué objeto es la fuente, que la propiedad de ese objeto es el que usted están interesados ​​en. BindingOperations.SetBinding es un método estático que especifica qué DependencyProperty en el que DependencyObject es el destino del enlace (argumentos 2 & 1, respectivamente) y el enlace que se utilizará para llegar a la fuente.

HTH

, Tony

Cuestiones relacionadas