Рассмотрим объявление глобальной переменной.
// 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);
});
})();
Можно использовать 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}}" />
я нашел решение здесь:
Здесь подробный пример того, как связать с перечислениями в 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
Для пошаговой пошаговой демонстрации альтернатив и дериваций техники, попробуйте эту веб-страницу:
Недостающая.NET № 7: Отображение Перечислений в WPF
Эта статья демонстрирует метод переопределения презентации определенных значений также. Хорошее чтение с большим количеством примеров кода.
Третье решение:
Это - немного больше работы заранее, лучше легче в конечном счете, если Вы связываете с загрузками Перечислений. Используйте Преобразователь, который берет тип перечисления в качестве параметра и преобразовывает его в массив строк как вывод.
В 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}}" />
Я думаю, что использование 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);
}
}