如何从XAML开始显示按钮?

时间:2011-08-27 16:51:40

标签: c# wpf xaml

让我为您提供更多详情。情况是我正在使用用户控件,我有一个依赖对象,其中接收枚举。根据值,必须显示一个按钮。

我的意思是:

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));
}

当EntradaProperty收到Entradas.Entero时,它必须在用户控件中显示一个按钮,当放入Decimal时,必须消失按钮。虽然,该属性也必须包含默认值。

我不知道是否必须在EntradaProperty中声明PropertyMetadata对象或使用IValueConverter。

我该怎么做?提前谢谢。

4 个答案:

答案 0 :(得分:2)

您可以创建IValueConverter实施来执行您需要的操作。结果将是System.Windows.Visibility对象;

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;
    }
}

现在,在XAML ......

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

答案 1 :(得分:1)

您可以通过元数据或ValueConverter执行此操作。已经给出了valueConverter的示例。这是一个通过元数据来做的例子。

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
  }
}

答案 2 :(得分:0)

您可以在TableroUserControl的XAML中使用自定义IValueConverter或声明DataTrigger

答案 3 :(得分:0)

如果EntradaProperty没有以任何其他方式更改,而不是通过属性Entrada,则应该有效:

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

默认值必须在别处指定,但Entradas将以Entero sou开头,显示开头的按钮应该有效。