Как динамически связывать значение enum из коллекции? (WPF) [duplicate]

Ваш код почти прав, но вам нужно отправить 2 последовательности \r\n, чтобы удовлетворить HTTP-протокол.

Правильный запрос GET будет выглядеть следующим образом (примечание 2 строки):

GET / HTTP/1.1

Итак, ваш код должен быть:

s.sendall('GET / HTTP/1.1\r\n\r\n')

. Кроме того, для действительных запросов HTTP 1.1 требуются дополнительные заголовки, такие как Host:. Вам нужно добавить их в свой запрос, примерно так:

s.sendall('''GET / HTTP/1.1
Host: cnn.com

''')
31
задан Michal Ciechan 21 October 2010 в 10:11
поделиться

3 ответа

Да, это возможно. Это сделает это. Скажем, у нас есть перечисление

public enum MyEnum
{
    [Description("MyEnum1 Description")]
    MyEnum1,
    [Description("MyEnum2 Description")]
    MyEnum2,
    [Description("MyEnum3 Description")]
    MyEnum3
}

. Тогда мы можем использовать ObjectDataProvider как

xmlns:MyEnumerations="clr-namespace:MyEnumerations"
<ObjectDataProvider MethodName="GetValues"
                ObjectType="{x:Type sys:Enum}"
                x:Key="MyEnumValues">
    <ObjectDataProvider.MethodParameters>
        <x:Type TypeName="MyEnumerations:MyEnum" />
    </ObjectDataProvider.MethodParameters>
</ObjectDataProvider>

. И для ListBox мы устанавливаем ItemSource в MyEnumValues ​​и применяем ItemTemplate с Конвертер.

<ListBox Name="c_myListBox" SelectedIndex="0" Margin="8"
        ItemsSource="{Binding Source={StaticResource MyEnumValues}}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Converter={StaticResource EnumDescriptionConverter}}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

И в конвертере мы получаем описание и возвращаем его

public class EnumDescriptionConverter : IValueConverter
{
    private string GetEnumDescription(Enum enumObj)
    {
        FieldInfo fieldInfo = enumObj.GetType().GetField(enumObj.ToString());

        object[] attribArray = fieldInfo.GetCustomAttributes(false);

        if (attribArray.Length == 0)
        {
            return enumObj.ToString();
        }
        else
        {
            DescriptionAttribute attrib = attribArray[0] as DescriptionAttribute;
            return attrib.Description;
        }
    }

    object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Enum myEnum = (Enum)value;
        string description = GetEnumDescription(myEnum);
        return description;
    }

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return string.Empty;
    }
}

Метод GetEnumDescription, вероятно, должен идти куда-то еще, но вы получаете идею:)

83
ответ дан Fredrik Hedblad 17 August 2018 в 18:12
поделиться
  • 1
    Спасибо, сейчас попробуем попробовать :) – Michal Ciechan 21 October 2010 в 14:47
  • 2
    Люблю это, держись. Я использовал небольшой linq для соединения GetEnumDescription, вы можете его обмануть здесь pastebin.com/XLm9hbhG – Will 15 December 2010 в 17:21
  • 3
    Итак, вы должны сделать конвертер для каждого типа перечисления? – Carlo 28 June 2011 в 00:30
  • 4
    Помните, что вам нужно создать экземпляр конвертера в качестве ресурса, например: <helper:EnumDescriptionConverter x:Key="HEnumDescriptionConverter" /> – Timm 31 July 2012 в 14:06
  • 5
    Это сломается, если у вас есть другой атрибут в перечислении - я бы предложил изменения кода для атрибута = attribArray.OfType & lt; DescriptionAttribute & gt; (). FirstOrDefault (); и вместо этого проверяет значение null, поскольку он более надежный. – RichardOD 26 June 2013 в 16:31

Если вы связываетесь с Enum, вы, вероятно, можете преобразовать его в описание через IValueConverter.

См. Связывание ComboBoxes с перечислениями ... в Silverlight! для описания о том, как это сделать.

Для получения дополнительной информации см. http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx .

2
ответ дан Community 17 August 2018 в 18:12
поделиться

Вы можете определить файл ressource в вашем проекте (файл * .resx). В этом файле вы должны определить «пары ключ-значение», что-то вроде этого:

"YellowCars" : "Yellow Cars",
"RedCars" : "Red Cars",

и т. Д. ...

Ключи равны вашим перечисляющим элементам , что-то вроде этого:

public enum CarColors
{
    YellowCars,
    RedCars
}

и т. д. ...

Когда вы используете WPF, вы можете реализовать в своем XAML-коде что-то вроде этого:

<ComboBox ItemsSource="{Binding Source={StaticResource CarColors}}" SelectedValue="{Binding CarColor, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Converter={StaticResource CarColorConverter}}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Тогда вы должны написать свой конвертер, что-то вроде этого:

using System;
using System.Globalization;
using System.Resources;
using System.Windows.Data;

public class CarColorConverter : IValueConverter
{
    private static ResourceManager CarColors = new ResourceManager(typeof(Properties.CarColors));

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var key = ((Enum)value).ToString();
        var result = CarColors.GetString(key);
        if (result == null) {
            result = key;
        }

        return result;
    }

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

Мой ответ наступает через 7 лет ;-) Но, возможно, он может быть использован кем-то другим!

1
ответ дан peter70 17 August 2018 в 18:12
поделиться
Другие вопросы по тегам:

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