Назначить свойство enum в xaml с помощью silverlight - PullRequest
2 голосов
/ 07 мая 2010

У меня есть свойство типа данных enum: вроде

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

И определено enum:

  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 ]

4 голосов
/ 07 мая 2010

Скотт имеет хороший ответ на реальный вопрос, однако всегда полезно спросить себя: «Как мне может понадобиться код , такой как , в будущем? Как я могу избежать создания еще одного класса и вместо этого повторно использовать то, что у меня уже есть? ".

Вот более общий вариант решения Скотта: -

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" />

В этом подходе мы можем преобразовать любое перечисление в значение Visibility с помощью ConverterParameter, чтобы указать значение перечисления (в виде строки), которое составляет состояние Visible.

Соблазнительно пойти дальше, чтобы позволить более чем одному значению перечисления быть равным «Видимым». Однако в настоящее время код не намного сложнее, чем более конкретная реализация Скотта. Следовательно, это улучшение следует оставить до тех пор, пока оно не понадобится.

3 голосов
/ 07 мая 2010

Я думаю, что вы можете просто создать 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}" />
0 голосов
/ 25 июня 2012

Я знаю, что это немного старый вопрос, но все вы сосредоточены на конвертерах, и есть гораздо лучший (на мой взгляд) способ сделать это без использования кода:

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

0 голосов
/ 10 мая 2010
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}" >
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...