2010-12-14 8 views
20

Quiero vincular una propiedad de solo lectura de un control a mi modelo de vista para que el valor esté disponible en el modelo de vista.Cómo enlazar una propiedad de control WPF de solo lectura (por ejemplo, ActualWidth) para que su valor sea accesible en el modelo de vista?

¿Cuál es la mejor manera de hacerlo?

Por ejemplo, me gustaría vincular ActualWidth a una propiedad en mi modelo de vista. El valor de ancho lo genera WPF usando su lógica de diseño, por lo que no puedo generar este valor en mi modelo de vista y llevarlo a la propiedad de control, como sería normalmente el caso. En cambio, necesito que WPF genere el valor y lo aplique al modelo de vista.

me acaba de utilizar Mode=OneWayToSource, pero esto no funciona para propiedades de sólo lectura:

<Border 
     ... 
     ActualWidth="{Binding MyDataModelWidth, Mode=OneWayToSource}" 
     > 
     ... child controls ... 
    </Border> 

La forma en que estoy haciendo en este momento es manejar SizeChanged de la frontera y el código subyacente se conecta el valor en el modelo de vista, pero esto no se siente del todo bien.

¿Alguien ya ha resuelto este problema?

ACTUALIZACIÓN: Mi pregunta es, efectivamente, un duplicado de éste: Pushing read-only GUI properties back into ViewModel

Respuesta

9
+0

impresionante. ambos casi al mismo tiempo, con el mismo enlace. ¡jaja! – Nawaz

+0

El segundo enlace es una buena solución reutilizable cuya base es lo que estás haciendo (usando el evento SizeChanged). – sowee15

+3

Podría incluir la esencia de la respuesta, una respuesta en StackOverflow no debería contener enlaces ... –

0

necesita realmente un enlace para que?

class MyVM 
    { 
     FrameworkElement _context; 

     public MyVM(FrameworkElement context) 
     { 
      _context = context; 
     } 

     public double Width 
     { 
      get { return _context.ActualWidth; } 
     } 
    } 
+1

Es una idea interesante, pero los objetos de IU se generan a partir de los objetos del modelo de vista, por lo que no pude pasar el FrameworkElement a través del constructor. Supongo que podría vincular el objeto del modelo de vista al FrameworkElement más adelante, pero parece que violaría un principio de WPF (podría estar violándolo de todos modos, pero al menos en mi implementación actual el modelo de vista no accede explícitamente a la interfaz de usuario). –

1

El problema real de por qué esto no se está descrita trabajar here.

Sin embargo, la solución dada para crear un colocador de lanzamiento para pasar la validación no funcionaría en su caso.

Creo que está bien llamar a un método en el ViewModel. Si ese es el código detrás de la parte que te molesta, quizás puedas usar la interactividad para llamar a un método basado en un activador de evento (SizeChanged).

Cuestiones relacionadas