¿Cómo puedo mostrar un botón desde XAML?

Permítame brindarle más detalles. La situación es que estoy trabajando en un control de usuario y tengo un objeto de dependencia donde recibe una enumeración. Dependiendo del valor, debe mostrar un botón o no.

Quiero decir:

public enum Entradas
{
    Entero, Decimal
}

public partial class TableroUserControl : UserControl
{
    public Entradas Entrada
    {
        get { return (Entradas)GetValue(EntradaProperty); }
        set { SetValue(EntradaProperty, value); }
    }

    public static readonly DependencyProperty EntradaProperty =
        DependencyProperty.Register("Entrada", typeof(Entradas), typeof(TableroUserControl));
}

Cuando EntradaProperty recibe Entradas.Entero, debe mostrar un botón en el control de usuario, y cuando se pone Decimal, debe desaparecer el botón. Aunque, la propiedad también debe contener un valor predeterminado.

No sé si debo declarar un objeto PropertyMetadata en EntradaProperty o usar un IValueConverter.

¿Cómo puedo hacer eso? Gracias por adelantado.

preguntado el 27 de agosto de 11 a las 16:08

4 Respuestas

Puedes crear un IValueConverter implementación para hacer lo que necesite. El resultado será un System.Windows.Visibility objeto;

class EntradasToVisibilityConverter : IValueConverter
{
    public Object Convert(
    Object value,
    Type targetType,
    Object parameter,
    CultureInfo culture )
    {
        // error checking, make sure 'value' is of type
        // Entradas, make sure 'targetType' is of type 'Visibility', etc.

        return (((Entradas)value) == Entradas.Entero) 
                ? Visibility.Visible
                : Visibility.Collapsed;
    }

    public object ConvertBack(
    object value,
    Type targetType,
    object parameter,
    CultureInfo culture )
    {
        // you probably don't need a conversion from Visibility
        // to Entradas, but if you do do it here
        return null;
    }
}

Ahora, en XAML ...

<SomeParentControl.Resources>
    <myxmlns:EntradasToVisibilityConverter x:key="MyEntradasToVisConverter" />
</SomeParentControl.Resources>
<Button
    Visibility="{Binding MyEnumValue, Converter={StaticResource MyEntradasToVisConverter}}"
/>

Respondido 27 ago 11, 20:08

Puede hacerlo mediante metadatos o mediante ValueConverter. Ya se dan los ejemplos para valueConverter. Aquí un ejemplo de cómo hacerlo mediante metadatos.

public static readonly DependencyProperty EntradaProperty = 
        DependencyProperty.Register("Entrada", typeof(Entradas), typeof(TableroUserControl), new UIPropertyMetadata((d,e)=> { ((TableroUserControl)d).EntradaPropertyChanged(e); }));

private EntradaPropertyChanged(DependencyPropertyChangedEventArgs e){
  Entradas entrada=(Entradas)e.NewValue ;
  if(entrada=Entradas.Entero)
     // Show your control 
  }else{
     // Hide your control
  }
}

Respondido 27 ago 11, 21:08

Puedes usar tu personalizado IValueConverter o declarar DataTrigger en el XAML de TableroUserControl.

Respondido 27 ago 11, 20:08

If EntradaProperty no se modifica de ninguna otra manera que a través de la propiedad Entrada Esto debería funcionar:

public Entradas Entrada
{
    get { return (Entradas)GetValue(EntradaProperty); }
    set 
    { 
        SetValue(EntradaProperty, value); 
        if (Entrada == Entradas.Entero)
            //show button
        else
            //hide button
    }
}

el valor predeterminado tendría que especificarse en otro lugar, pero Entradas se iniciará como Entero sou mostrando el botón al principio debería funcionar.

Respondido 27 ago 11, 21:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.