2011-10-05 11 views
9
<Controls:MyControl Mode="Mode1" Value="{Binding Path=Something}" /> 

El problema que tengo es que la vinculación ocurre antes de que se establezca la propiedad Mode cuando utilizo este control en una plantilla de datos de un ListView.WPF Enlazar orden de cómo asegurar una propiedad se une antes que otra

¿Cómo me aseguro de que el modo esté siempre configurado antes del enlace de valores?

+0

Depende de lo que quiere decir con "El mouse siempre está configurado antes". Supongo que 'Mode' también tiene un valor predeterminado. ¿Desea que la unión ocurra cuando 'Mode' no es nulo? –

+0

Parece que Value Coercion puede ser una solución adecuada para usted. – vcsjones

+0

@Meleak Estoy hablando de la propiedad Mode de mi control, no del mouse. El problema es que la vinculación está sucediendo antes de que se establezca la propiedad Mode. Y eso afecta cómo se comporta el control. Quiero que el Modo se establezca primero. El modo tiene un valor predeterminado, por lo que nunca es nulo, pero quiero elegir el modo del control antes de que ocurra el enlace. – lahsrah

Respuesta

1

Lo que podría hacer es retrasar la vinculación, por lo que puede estar (casi) seguro de que el valor del modo está establecido hasta entonces. Hay una propiedad de enlace de retraso en .NET 4.5. He aquí un artículo sobre cómo simular que en .NET 4,0 Delay property on Binding from .Net 4.5 in .Net 4.0

yo personalmente poner en práctica un modelo de vista que, en (MVVM), donde este tipo de problema es bastante simple de resolver. Haz dos propiedades Modo y Algo. Cuando el modo cambia, debe activar la propiedad "Something" también (a través de la interfaz INotifyPropertyChanged).

class MyViewModel : INotifyPropertyChanged 
    { 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    private string _mode; 

    public string Mode 
    { 
     get { return _mode; } 
     set 
     { 
     _mode = value; 
     OnPropertyChanged("Mode"); 

     // OnPropertyChanged("Something"); 
     // or build up via a method: 
     // Something = DetermineFromMode(Mode); 
     } 
    } 

    private string _something; 

    public string Something 
    { 
     get { return _something; } 
     set 
     { 
     _something = value; 
     OnPropertyChanged("Something"); 
     } 
    } 
    } 
+0

El retraso (en .Net4.5) se usa cuando queremos retrasar la actualización de la fuente del objetivo, pero aquí la situación es inversa. –

1

¿Ha intentado levantar el evento cambiado propiedad para su propiedad "Algo" cuando se establece el modo de su control? Puede obtener el "algo" propiedad de controlar como esto -

Binding binding = BindingOperations.GetBindingExpression(this, this.Value).ParentBindingBase; 
String propertyToRefresh = binding.Path.Path; 

(this.DataContext as ViewModel).OnPropertyChange(propertyToRefresh); 

Estoy asumiendo que el DataContext de su control es ejemplo de su modelo de vista que implementa INotifyPropertyChangedInterface.

En caso de que el método OnPropertyChange de su clase Viemodel no sea público o no tenga ninguna referencia a su clase ViewModel bajo su control. Simplemente puede llamar a UpdateTarget() en su BindingExpression así (como lo sugiere Thomas Levesque) -

BindingExpression binding = BindingOperations.GetBindingExpression(this, this.Value); 
binding.UpdateTarget(); 
+0

OnPropertyChanged generalmente no es público; una mejor opción sería forzar el enlace para actualizar, llamando a UpdateTarget en BindingExpression –

+0

¡Sí! He actualizado mi respuesta. Muchas gracias, casi me pierdo esta parte. –

+0

No puedo usar eventos modificados por la propiedad porque, en función de la propiedad Modo, todo lo que está vinculado al valor puede descartarse y no podrá recuperarse nunca. – lahsrah

Cuestiones relacionadas