Привязка ComboBoxes к перечислениям … в Silverlight!

-g говорит компилятору хранить информацию таблицы символов в исполняемом файле. Среди прочего это включает:

  • имена символа
  • информация о типе для символов
  • файлы и номера строки, куда символы прибыли от

, Отладчики используют эту информацию, чтобы произвести понятные имена для символов и связать инструкции с конкретными строками в источнике.

Для некоторых компиляторов, предоставляя-g отключит определенную оптимизацию. Например, ICC устанавливает уровень оптимизации по умолчанию на-O0 с-g, если Вы явно не указываете на-O[123]. Кроме того, даже при предоставлении-O[123] будет все еще отключена оптимизация, которая предотвращает трассировку стека (например, разделяющий указатели кадра от стековых фреймов. Это имеет только незначительный эффект на производительность).

С некоторыми компиляторами,-g отключит оптимизацию, которая может перепутать, куда символы прибыли из (переупорядочение инструкции, развертывание цикла, встроив и т.д.). Если Вы хотите отладить с оптимизацией, можно использовать-g3 с gcc для обхождения части этого. Дополнительная информация об отладке будет включена о макросах, расширениях и функциях, которые, возможно, были встроены. Это может позволить отладчикам и инструментам производительности отображать оптимизированный код на первоисточник, но это - максимальные усилия. Некоторая оптимизация действительно искажает код.

Для большего количества информации, смотрите на КАРЛИК , формат отладки, первоначально разработанный для соглашений с ELF (двоичный формат для Linux и другая ОС).

38
задан Domenic 15 August 2009 в 08:58
поделиться

2 ответа

Ах, я слишком рано заговорил! Существует совершенно хорошее решение , по крайней мере, в Silverlight 3. (Возможно, только в 3, поскольку этот поток указывает, что ошибка, связанная с этим материалом, была исправлена ​​в Silverlight 3. )

По сути, вам нужен один преобразователь для свойства ItemsSource , но он может быть полностью универсальным без использования каких-либо запрещенных методов, если вы передаете ему имя свойства, тип которого MyEnum . А привязка данных к SelectedItem совершенно безболезненна; конвертер не нужен! Ну, по крайней мере, до тех пор, пока вам не нужны пользовательские строки для каждого значения перечисления, например, DescriptionAttribute , хм ... для этого, вероятно, потребуется другой преобразователь; надеюсь, что смогу сделать его общим.

Обновление: Сделал конвертер, работает! К сожалению, мне нужно привязать к SelectedIndex , но это нормально. Используйте этих ребят:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows.Data;

namespace DomenicDenicola.Wpf
{
    public class EnumToIntConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            // Note: as pointed out by Martin in the comments on this answer, this line
            // depends on the enum values being sequentially ordered from 0 onward,
            // since combobox indices are done that way. A more general solution would
            // probably look up where in the GetValues array our value variable
            // appears, then return that index.
            return (int)value;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return Enum.Parse(targetType, value.ToString(), true);
        }
    }
    public class EnumToIEnumerableConverter : IValueConverter
    {
        private Dictionary<Type, List<object>> cache = new Dictionary<Type, List<object>>();

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            var type = value.GetType();
            if (!this.cache.ContainsKey(type))
            {
                var fields = type.GetFields().Where(field => field.IsLiteral);
                var values = new List<object>();
                foreach (var field in fields)
                {
                    DescriptionAttribute[] a = (DescriptionAttribute[])field.GetCustomAttributes(typeof(DescriptionAttribute), false);
                    if (a != null && a.Length > 0)
                    {
                        values.Add(a[0].Description);
                    }
                    else
                    {
                        values.Add(field.GetValue(value));
                    }
                }
                this.cache[type] = values;
            }

            return this.cache[type];
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

С такого рода привязкой XAML:

<ComboBox x:Name="MonsterGroupRole"
          ItemsSource="{Binding MonsterGroupRole,
                                Mode=OneTime,
                                Converter={StaticResource EnumToIEnumerableConverter}}"
          SelectedIndex="{Binding MonsterGroupRole,
                                  Mode=TwoWay,
                                  Converter={StaticResource EnumToIntConverter}}" />

И такого рода объявлением ресурсов XAML:

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:ddwpf="clr-namespace:DomenicDenicola.Wpf">
    <Application.Resources>
        <ddwpf:EnumToIEnumerableConverter x:Key="EnumToIEnumerableConverter" />
        <ddwpf:EnumToIntConverter x:Key="EnumToIntConverter" />
    </Application.Resources>
</Application>

Любые комментарии приветствуются, поскольку я в некотором роде являюсь сторонником XAML / Silverlight / WPF / и т. Д. новичок. Например, будет ли EnumToIntConverter.ConvertBack медленным, поэтому мне следует рассмотреть возможность использования кеша?

34
ответ дан 27 November 2019 в 03:52
поделиться

Существует другой способ привязки ComboBox к перечислениям без необходимости создания пользовательского конвертера для выбранного элемента. Вы можете проверить его на

http://charlass.wordpress.com/2009/07/29/binding-enums-to-a-combobbox-in-silverlight/

Он не использует DescriptionAttributes...., но он отлично работает для меня, так что я думаю, это зависит от сценария, в котором он будет использоваться

4
ответ дан 27 November 2019 в 03:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: