Используя Ruby on Rails, я заполняю 'выбор' с помощью времен с помощью данного инкремента, такой как каждые 30 минут. В настоящее время я выписываю все возможности в файле YAML, но я чувствую, что существует дождевик путь. Я думаю, что хочу обеспечить start_time, end_time, инкремент и в настоящее время просто еще одна опция под названием 'Закрытый' (думайте 'business_hours'). Так, мой выбор мог бы отобразиться:
'Закрытый'
5:00
5:30
6:00
...
[полностью к]...
23:30
Кто-либо может думать о лучшем способе сделать это или просто 'записывает' их всех лучший способ?
Этот ответ основан на ответе @emh.
def create_hours(parameters)
start_time = parameters[:start_time] ? parameters[:start_time] : 0
end_time = parameters[:end_time] ? parameters[:end_time] : 24.hours
increment = parameters[:increment] ? parameters[:increment] : 30.minutes
Array.new(1 + (end_time - start_time)/increment) do |i|
(Time.now.midnight + (i*increment) + start_time).strftime("%I:%M %p")
end
end
Вы можете использовать это следующим образом:
create_hours(:start_time => 5.hours, :end_time => 23.hours)
=> ["05:30 AM", "06:00 AM", "06:30 AM", "07:00 AM", "07:30 AM", "08:00 AM",
"08:30 AM", "09:00 AM", "09:30 AM", "10:00 AM", "10:30 AM", "11:00 AM",
"11:30 AM", "12:00 PM", "12:30 PM", "01:00 PM", "01:30 PM", "02:00 PM",
"02:30 PM", "03:00 PM", "03:30 PM", "04:00 PM", "04:30 PM", "05:00 PM",
"05:30 PM", "06:00 PM", "06:30 PM", "07:00 PM", "07:30 PM", "08:00 PM",
"08:30 PM", "09:00 PM", "09:30 PM", "10:00 PM", "10:30 PM", "11:00 PM"]
Чтобы добавить «Закрытый», используйте:
["closed"] + create_hours(:start_time => 5.hours, :end_time => 23.hours)
Вы также можете передать : increment => 15.minutes
- по умолчанию он установлен на 30 минут
.
["closed"] + Array.new(24.hours / 30.minutes) do |i|
(Time.now.midnight + (i*30.minutes)).strftime("%I:%M %p")
end
Мне удалось установить (более раннюю версию) SDK на компьютере с ОС Windows, а затем скопировать соответствующие библиотеки в среду разработки Linux. Я хотел бы, чтобы солнце предоставило все JDK в формате zip/tar. Я ненавижу установку программного обеспечения только для того, чтобы получить файлы .jar из архива. Следует отметить, что SDK включает в себя эмулятор мобильного устройства, который не работает под Linux, но для компиляции кода нужен только .jars.
-121--4903732-Для того, чтобы любой человек, исследующий этот вопрос в будущем, вот решение, которое я в конечном итоге реализовал. Это основано на ответе Джона Боуэна, который я выбрал как лучшее решение проблемы.
Сначала я создал стиль для прозрачного списка, содержащего переключатели, как предметы. Затем я создал кнопки для перехода в поле списка - мои кнопки исправлены, а не считываются в приложение как данные, поэтому я жестко закодировал их в разметку.
Я использую перечисление ListButtons
в модели представления, чтобы представить кнопки в списке, и я использую свойство Тэгов
каждой кнопки, чтобы передать последовательности значение перечисления для этой кнопки. Свойство ListBox.SelectedStartPath
позволяет указать свойство Тэгов
в качестве источника для выбранного значения, которое связывается с моделью представления с помощью свойства SelectedValue
. Я думал, что мне понадобится конвертер значений для преобразования между последовательностью и его значением перечисления, но встроенные конвертеры WPF справились с преобразованием без проблем.
Вот полная разметка для Window1.xaml :
<Window x:Class="RadioButtonMvvmDemo.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<!-- Resources -->
<Window.Resources>
<Style x:Key="RadioButtonList" TargetType="{x:Type ListBox}">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="{x:Type ListBoxItem}" >
<Setter Property="Margin" Value="5" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Border BorderThickness="0" Background="Transparent">
<RadioButton
Focusable="False"
IsHitTestVisible="False"
IsChecked="{TemplateBinding IsSelected}">
<ContentPresenter />
</RadioButton>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Setter.Value>
</Setter>
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBox}">
<Border BorderThickness="0" Padding="0" BorderBrush="Transparent" Background="Transparent" Name="Bd" SnapsToDevicePixels="True">
<ItemsPresenter SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<!-- Layout -->
<Grid>
<!-- Note that we use SelectedValue, instead of SelectedItem. This allows us
to specify the property to take the value from, using SelectedValuePath. -->
<ListBox Style="{StaticResource RadioButtonList}" SelectedValuePath="Tag" SelectedValue="{Binding Path=SelectedButton}">
<ListBoxItem Tag="ButtonA">Button A</ListBoxItem>
<ListBoxItem Tag="ButtonB">Button B</ListBoxItem>
</ListBox>
</Grid>
</Window>
Модель представления имеет единственное свойство SelectedButton, которое использует перечисление ListButtons для отображения выбранной кнопки. Свойство вызывает событие в базовом классе, который я использую для моделей просмотра, которое вызывает событие PropertyChanged
:
namespace RadioButtonMvvmDemo
{
public enum ListButtons {ButtonA, ButtonB}
public class Window1ViewModel : ViewModelBase
{
private ListButtons p_SelectedButton;
public Window1ViewModel()
{
SelectedButton = ListButtons.ButtonB;
}
/// <summary>
/// The button selected by the user.
/// </summary>
public ListButtons SelectedButton
{
get { return p_SelectedButton; }
set
{
p_SelectedButton = value;
base.RaisePropertyChangedEvent("SelectedButton");
}
}
}
}
В производственном приложении установщик SelectedButton
вызовет метод класса обслуживания, который выполнит действие, требуемое при выборе кнопки.
И чтобы быть полным, вот базовый класс:
using System.ComponentModel;
namespace RadioButtonMvvmDemo
{
public abstract class ViewModelBase : INotifyPropertyChanged
{
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
#region Protected Methods
/// <summary>
/// Raises the PropertyChanged event.
/// </summary>
/// <param name="propertyName">The name of the changed property.</param>
protected void RaisePropertyChangedEvent(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChangedEventArgs e = new PropertyChangedEventArgs(propertyName);
PropertyChanged(this, e);
}
}
#endregion
}
}
Надежда, которая помогает!
-121--962293- Вместо < select >
можно использовать тип ввода HTML5 time
:
<input type='time' min='05:30' max='23:30' step='00:30' />
Поскольку ввод time
доступен только в HTML5 (на данный момент его поддерживает только Opera). Я задал вопрос о том, чтобы сделать то же самое для элемента < input type = 'range' >
.