使用silverlight在xaml中分配枚举属性

时间:2010-05-07 14:15:22

标签: c# silverlight

我有一个datattype枚举属性:喜欢

public BreakLevel Level
{
    get { return level; }
    set { level = value; }
}

枚举定义:

  public enum BreakLevel
    {
        Warning, Fatal
    }

我希望将neum属性绑定到我的边框的可见性,有点像这样:

Visibility =“{Binding BreakLevel.Fatal}” 那可能吗?

<Border CornerRadius="4" BorderThickness="1"  BorderBrush="#DAE0E5"  
Visibility="{Binding DataContext.IsError, Converter={StaticResource BoolToVisibilityConverter}, RelativeSource={RelativeSource TemplatedParent}}" >

4 个答案:

答案 0 :(得分:4)

斯科特对实际问题有一个很好的答案,但是总是一个好主意问自己“我将来如何需要代码喜欢这个?我怎么能避免创建另一个类和而是重复使用我已经得到的东西?“。

以下是Scott解决方案的更一般变体: -

public class EnumToVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
        if (Enum.GetName(value.GetType(), value).Equals(parameter)) 
            return Visibility.Visible; 
        else 
            return Visibility.Hidden; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
        return null; 
    } 
} 

的Xaml: -

<TopLevelWindowOrControl.Resources>   
    <local:EnumToVisibilityConverter x:Key="EnumToVisibilityConverter" />   
</TopLevelWindowOrControl.Resources>   

<Border Visibility="{Binding Path=BreakLvlProperty, Converter={StaticResource EnumToVisibilityConverter}, ConverterParameter=Fatal" />

在这种方法中,我们可以使用ConverterParameter指定构成“可见”状态的枚举值(以字符串形式),将任何枚举转换为可见性值。

很有可能采取这一措施,允许将多个枚举值等同于“可见”。然而,目前代码并不比Scott更具体的实现复杂得多。因此,应该保留此增强功能。

答案 1 :(得分:3)

我认为你可以创建一个BreakLevelToVisibilityConverter并像你提供的例子一样绑定。

我假设边框的DataContext设置为具有“BreakLevel”类型属性的类的实例(我们将此属性称为“BreakLvlProperty”)。

如果BreakLvlProperty的值为BreakLevel.Fatal

,则下面的代码将显示边框

转换器:

public class BreakLevelToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if ((BreakLevel)value == BreakLevel.Fatal)
            return Visibility.Visible;
        else
            return Visibility.Hidden;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }
}

XAML:

<TopLevelWindowOrControl.Resources>
    <local:BreakLevelToVisibilityConverter x:Key="BreakLevelToVisibilityConverter" />
</TopLevelWindowOrControl.Resources>

<Border Visibility="{Binding Path=BreakLvlProperty, Converter={StaticResource BreakLevelToVisibilityConverter}" />

答案 2 :(得分:0)

public class EnumToVisibilityConvertor : IValueConverter
{
    private bool chk;
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if ((value != null) && (value is BreakLevel) && (targetType == typeof(Visibility)))
        {
          chk =   ((((BreakLevel) value) == (BreakLevel) Enum.Parse(typeof (BreakLevel), parameter.ToString(), true)));
          return (chk==true) ? Visibility.Visible : Visibility.Collapsed;
        }

        throw new InvalidOperationException("Invalid converter usage.");
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;

    }
}





      <Border CornerRadius="4" BorderThickness="1"  BorderBrush="#DAE0E5"  
Visibility="{Binding Path=Level, Converter={StaticResource enumToVisibilityConvertor},ConverterParameter=Fatal}" >

答案 3 :(得分:0)

我知道这是一个有点老问题,但你们所有人都专注于转换器,并且在不涉及代码隐藏的情况下(我认为)这样做的方式要好得多:

    <ContentControl>
        <ContentControl.Template>
            <ControlTemplate>
                <Grid>
                    <!-- Here is the border which will be shown if Object.Level has value Fatal -->
                    <Border x:Name="PART_Border"
                        Visibility="Collapsed"
                        BorderThickness="3" BorderBrush="Red"
                        CornerRadius="4">
                    </Border>
                    <TextBlock>Interiors of the border</TextBlock>
                </Grid>
                <ControlTemplate.Triggers>
                    <!-- This is the code which turns on border's visibility -->
                    <DataTrigger Binding="{Binding Level}" Value="{x:Static local:BreakLevel.Fatal}">
                        <Setter TargetName="PART_Border" Property="Visibility" Value="Visible" />
                    </DataTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </ContentControl.Template>
    </ContentControl>

我假设DataContext中的一个对象具有属性Level,该属性是BreakLevel类型。