Как я могу заполнить поле комбинированного списка WPF в XAML со всеми объектами от данного перечисления?

Рассмотрим объявление глобальной переменной.

// Start notification countdown
$.countDownNotification = function(notification) {
    // IMPORTANT: Store the setInterval in a element-specific variable?
    timer = setInterval( function() {
        // Counts down from 10 and stores new value in data-attribute
        notification.attr('data-timer', notification.attr('data-timer') - 1);
    }, 1000);

    // Remove notification when timer is on 0
    if ( newRemaining == 0 ) {
        notification.remove();
    }
}

// `false` means no timer has been set
var timer = false;

// Pause on hover
$('.notification').on('mouseenter', function(e) {
    // IMPORTANT: Clear the elemnt-specific interval
    clearInterval( timer );
});

// Resume when hover ends
$('.notification').on('mouseleave', function(e) {
    var notification = $(this)

    $.countDownNotification(notification);
});

Другой способ не устанавливать глобальный объект - это вернуть setInterval() на .countDownNotification.

// Start notification countdown
$.countDownNotification = function(notification) {
    // IMPORTANT: Store the setInterval in a element-specific variable?
    var id = setInterval( function() {
        // Counts down from 10 and stores new value in data-attribute
        notification.attr('data-timer', notification.attr('data-timer') - 1);
    }, 1000);

    // Remove notification when timer is on 0
    if ( newRemaining == 0 ) {
        notification.remove();
    }

    return id;

}

( function() {

    // `false` means no timer has been set
    var timer = false;

    // Pause on hover
    $('.notification').on('mouseenter', function(e) {
        // IMPORTANT: Clear the elemnt-specific interval
        clearInterval( timer );
    });

    // Resume when hover ends
    $('.notification').on('mouseleave', function(e) {
        var notification = $(this)

        timer = $.countDownNotification(notification);
    });

})();
22
задан ThinkingStiff 7 February 2013 в 00:33
поделиться

5 ответов

Можно использовать ObjectDataProvider, чтобы сделать это:

<ObjectDataProvider MethodName="GetValues" 
    ObjectType="{x:Type sys:Enum}" x:Key="odp">
    <ObjectDataProvider.MethodParameters>
        <x:Type TypeName="local:CompassHeading"/>
    </ObjectDataProvider.MethodParameters>
</ObjectDataProvider>

<ComboBox ItemsSource="{Binding Source={StaticResource odp}}" />

я нашел решение здесь:

http://bea.stollnitz.com/blog/?p=28

23
ответ дан casperOne 29 November 2019 в 04:15
поделиться

Здесь подробный пример того, как связать с перечислениями в WPF

, Предполагают, что у Вас есть следующее перечисление

public enum EmployeeType    
{
    Manager,
    Worker
}

, можно затем связать в codebehind

typeComboBox.ItemsSource = Enum.GetValues(typeof(EmployeeType));

или использовать ObjectDataProvider

<ObjectDataProvider MethodName="GetValues" ObjectType="{x:Type sys:Enum}" x:Key="sysEnum">
    <ObjectDataProvider.MethodParameters>
        <x:Type TypeName="local:EmployeeType" />
    </ObjectDataProvider.MethodParameters>
</ObjectDataProvider>

, и теперь можно связать в разметке

<ComboBox ItemsSource="{Binding Source={StaticResource sysEnum}}" />

Также выезд: Привязка данных перечислимого свойства к ComboBox в WPF

6
ответ дан Community 29 November 2019 в 04:15
поделиться

Для пошаговой пошаговой демонстрации альтернатив и дериваций техники, попробуйте эту веб-страницу:

Недостающая.NET № 7: Отображение Перечислений в WPF

Эта статья демонстрирует метод переопределения презентации определенных значений также. Хорошее чтение с большим количеством примеров кода.

3
ответ дан Drew Noakes 29 November 2019 в 04:15
поделиться

Третье решение:

Это - немного больше работы заранее, лучше легче в конечном счете, если Вы связываете с загрузками Перечислений. Используйте Преобразователь, который берет тип перечисления в качестве параметра и преобразовывает его в массив строк как вывод.

В VB.NET:

Public Class EnumToNamesConverter
    Implements IValueConverter

    Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert
        Return [Enum].GetNames(DirectCast(value, Type))
    End Function

    Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
        Throw New NotImplementedException()
    End Function
End Class

Или в C#:

public sealed class EnumToNamesConverter : IValueConverter
{
  object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture)
  {
    return Enum.GetNames(value.GetType());
  }

  object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  {
    throw New NotSupportedException()
  }
}

Затем в Вашем Application.xaml, добавьте глобальный ресурс для доступа к этому преобразователю:

<local:EnumToNamesConverter x:Key="EnumToNamesConverter" />

Наконец используют преобразователь на любых страницах XAML, где Вам нужны значения любого Перечисления...

<ComboBox ItemsSource="{Binding
                        Source={x:Type local:CompassHeading},
                        Converter={StaticResource EnumToNamesConverter}}" />
1
ответ дан Drew Noakes 29 November 2019 в 04:15
поделиться

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

<ComboBox ItemsSource="{local:EnumValues local:EmployeeType}"/>

Вот код для расширения разметки:

[MarkupExtensionReturnType(typeof(object[]))]
public class EnumValuesExtension : MarkupExtension
{
    public EnumValuesExtension()
    {
    }

    public EnumValuesExtension(Type enumType)
    {
        this.EnumType = enumType;
    }

    [ConstructorArgument("enumType")]
    public Type EnumType { get; set; }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        if (this.EnumType == null)
            throw new ArgumentException("The enum type is not set");
        return Enum.GetValues(this.EnumType);
    }
}
14
ответ дан 29 November 2019 в 04:15
поделиться
Другие вопросы по тегам:

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