2009-09-12 28 views
8

Tengo una aplicación WPF donde he tratado de implementar el patrón MVVM y Prism 2. Tengo un Usercontrol que se ha suscrito a un evento disparado desde otro Usercontrol. Me gustaría alternar la visibilidad de algunos elementos secundarios en el control de suscripción. Los eventos se disparan correctamente, incluso puedo vincular datos con éxito a algunos elementos. ¿Cómo puedo vincular Visibility o cualquier propiedad de estilo con ViewModel y cambiarlos dinámicamente?Cómo cambiar la visibilidad de un control WPF desde ViewModel

Respuesta

23

Puede tener una propiedad booleana en su ViewModel y vincular esa propiedad a la propiedad Visibilidad de sus controles. Debido a que estará asigning un valor booleano y la propiedad de visibilidad espera un valor de visibilidad enumeración, tendrá que utilizar el convertidor BooleanToVisibilityConverter para hacer la conversión,

<Style.Resources> 
    <BooleanToVisibilityConverter x:Key="booleanToVisibilityConverter" /> 
</Style.Resources> 

<Image Visibility="{Binding Path=ShowImage, 
        Converter={StaticResource booleanToVisibilityConverter}}"/> 

Espero que esto ayude.

Ezequiel Jadib

+0

De alguna manera esto no funcionó para mí. Decidí convertidor en Usercontrol.Resources sección y enlaces utilizados como ha explicado en el comentario. – Raj

+1

Disculpe mi error. Esto funciona. Gracias. – Raj

8

Aunque la adición de una propiedad booleana y el uso de un convertidor de valores obras, recomendaría la adición de una propiedad de tipo visibilidad a este modelo de vista, por ejemplo,

public Visibility ImageVisibility 
{ 
    get { return shouldShowImage ? Visibility.Visible : Visibility.Collapsed } 
} 

La ventaja de este método es que no es necesario escribir un convertidor para cada propiedad que desea expresarse de una manera visual (por ejemplo, para un nivel de stock que convierte una etiqueta roja cuando cae por debajo de 10, podría tener un convertidor que use una vez o simplemente exponer una propiedad StockLabelBrush desde su VM)

+0

Si bien esta respuesta es elegante, hay un problema con ella. Si el programa cambia 'shouldShowImage', ese cambio no se envía a la vista. – James

+1

Eso es cierto, pero hay un par de maneras de manejar el problema. Puede manejar el evento 'PropertyChanged' desde' shouldShowImage' y generar un nuevo evento 'PropertyChanged', o solo permitir el acceso a' shouldShowImage' a través de una propiedad de contenedor que genera eventos para ambas propiedades. – Darren

1

Sé que esta es una pregunta antigua, pero hay una solución simple para las personas que se encuentran con este problema y encuentran esta respuesta.

En su modelo de vista, cree una propiedad "Visibilidad" de esta manera:

public Visibility ShowModifyButtons 
    { 
     get { return (Visibility)GetValue(ShowModifyButtonsProperty); } 
     set { SetValue(ShowModifyButtonsProperty, value); } 
    } 
public static readonly DependencyProperty ShowModifyButtonsProperty = 
     DependencyProperty.Register("ShowModifyButtons", typeof(Visibility), typeof(FileMatchViewModel), 
     new UIPropertyMetadata(Visibility.Collapsed)); 

En el XAML, se unen a ella de este modo:

<Button Focusable="False" Content="Save" Width="100" Margin="10" Visibility="{Binding ShowModifyButtons}"/> 

Ahora, a partir de su modelo de vista, puede establecer ShowModifyButtons en Visibility.Collapsed o Visibility.Visible según sea necesario.

Cuestiones relacionadas