- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
具有如下所示的 ListView,其中包含代表 Tasks
及其各自 Status
的项目:
TasksPage
XAML:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:iFacilityMob;assembly=iFacilityMob"
x:Class="iFacilityMob.TasksPage">
<ContentPage.Content>
...
<ListView
Grid.Row="1"
Grid.Column="0"
Grid.ColumnSpan="2"
x:Name="TasksListView"
HasUnevenRows="True"
SeparatorVisibility="None"
SelectionMode="None"
IsPullToRefreshEnabled="True"
Refreshing="TasksListView_OnRefreshing"
CachingStrategy="RetainElement">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<local:TaskCardTemplate></local:TaskCardTemplate>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
...
</ContentPage.Content>
任务卡模板 XAML:
<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="iFacilityMob.TaskCardTemplate">
<ContentView.Content>
<Frame x:Name="Frame"
IsClippedToBounds="True"
HasShadow="True"
Padding="2,5,5,2"
BackgroundColor="White"
Margin="10"
CornerRadius="5">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<!-- Vertical colored bar on the left which indicates the current Status -->
<BoxView x:Name="BVInitial" Grid.Row="0" Color="Green" IsVisible="{Binding InitialStatus}" Grid.RowSpan="2" Grid.Column="0" WidthRequest="8" Margin="0" CornerRadius="3"/>
<BoxView x:Name="BVStarted" Grid.Row="0" Color="DarkOrange" IsVisible="{Binding Started}" Grid.RowSpan="2" Grid.Column="0" WidthRequest="8" Margin="0" CornerRadius="3"/>
<BoxView x:Name="BVPaused" Grid.Row="0" Color="DodgerBlue" IsVisible="{Binding Paused}" Grid.RowSpan="2" Grid.Column="0" WidthRequest="8" Margin="0" CornerRadius="3"/>
<BoxView x:Name="BVFinished" Grid.Row="0" Color="Black" IsVisible="{Binding Finished}" Grid.RowSpan="2" Grid.Column="0" WidthRequest="8" Margin="0" CornerRadius="3"/>
<!-- Button Start -->
<Button Grid.Row="0" Grid.Column="1" x:Name="BtnStartTask" Text="Start" TextColor="White" BackgroundColor="Green" CornerRadius="5" Margin="5,5,0,0" HeightRequest="40"
Clicked="BtnStartTask_OnClicked" IsEnabled="{Binding StartEnabledAndVisible}" IsVisible="{Binding StartEnabledAndVisible}" CommandParameter="{Binding .}" />
<!-- Button Pause -->
<Button Grid.Row="0" Grid.Column="1" x:Name="BtnPauseTask" Text="Pause" TextColor="White" BackgroundColor="DodgerBlue" CornerRadius="5" Margin="5,5,0,0" HeightRequest="40"
Clicked="BtnPauseTask_OnClicked" IsEnabled="{Binding PauseEnabled}" IsVisible="{Binding PauseVisible}" CommandParameter="{Binding . }" />
<!-- Button End -->
<Button Grid.Row="1" Grid.Column="1" x:Name="BtnEndTask" Text="End" TextColor="White" BackgroundColor="Red" CornerRadius="5" Margin="5,0,0,5" HeightRequest="40"
Clicked="BtnEndTask_OnClicked" IsEnabled="{Binding EndEnabled}" CommandParameter="{Binding .}" />
...
<!-- The data of each Task, not important in this case -->
</Grid>
</Frame>
</ContentView.Content>
通过单击按钮,我可以更改任何 Task
项目的状态和 View 。
private async void BtnStartTask_OnClicked(object sender, EventArgs e)
{
var btn = (Button)sender;
if (btn.CommandParameter is TaskViewModel model)
{
// Task
if (model.ModelType == Enums.ModelType.Task.ToString())
{
await _api.UpdateStatus(new StatusUpdateDTO
{ID = model.ID, ModelType = Enums.ModelType.Task.ToString(), StatusID = (int) Enums.TaskStatus.Started});
}
else// Ticket
{
await _api.UpdateStatus(new StatusUpdateDTO
{ ID = model.ID, ModelType = Enums.ModelType.Ticket.ToString(), StatusID = (int)Enums.TicketStatus.Assigned });
}
UpdateView(Enums.Buttons.Start);
}
private void UpdateView(Enums.Buttons buttonPressed)
{
switch (buttonPressed)
{
case Enums.Buttons.Start:
// Hide Start
BtnStartTask.IsEnabled = false;
BtnStartTask.IsVisible = false;
// Show Pause
BtnPauseTask.IsEnabled = true;
BtnPauseTask.IsVisible = true;
// Enable End
BtnEndTask.IsEnabled = true;
BtnEndTask.IsVisible = true;
BVStarted.IsVisible = true;
BVFinished.IsVisible = false;
BVInitial.IsVisible = false;
BVPaused.IsVisible = false;
break;
case Enums.Buttons.Pause:
...
case Enums.Buttons.End:
...
}
}
一旦 Task
Started
,我如何实现这一点,我以某种方式禁用(禁用覆盖和按钮)所有其他 Tasks
和最终在 Activity 任务 Paused
或 Ended
时重新启用它们?
编辑:
任务页面 View 模型:
public class TaskViewModel: INotifyPropertyChanged
{
public int ID { get; set; }// TaskID or TicketID
public string ModelType { get; set; }// Task or Ticket
public string Title { get; set; }
public string Description { get; set; }
public int FloorID { get; set; }
public string FloorName { get; set; }
public int AreaID { get; set; }
public string AreaName { get; set; }
public int? ScheduledTaskID { get; set; }
public int? ScheduleID { get; set; }
private int _statusID { get; set; } // Task Status or TicketTask
public int StatusID
{
get => _statusID;
set
{
_statusID = value;
OnPropertyChanged();
}
}
public bool ActiveItem => (IsTask && (StatusID == (int) Enums.TaskStatus.Started )) || IsTicket && (StatusID == (int) Enums.TicketStatus.InProgress);
public bool NotActive => !ActiveItem;
public List<ProductDTO> Products { get; set; }
public bool IsTask => ModelType == ModelTypes.Task.ToString();
public bool IsTicket => ModelType == ModelTypes.Ticket.ToString();
public bool StartEnabledAndVisible
{
get
{
if (IsTask && StatusID == (int)Enums.TaskStatus.Created || StatusID == (int) Enums.TaskStatus.Paused)
{
return true;
}
return IsTicket && StatusID == (int) Enums.TicketStatus.Assigned;
}
}
public bool PauseEnabled
{
get
{
if (IsTask && StatusID == (int)Enums.TaskStatus.Started)
{
return true;
}
return IsTicket && StatusID == (int)Enums.TicketStatus.InProgress;
}
}
public bool PauseVisible
{
get
{
if (IsTask && StatusID == (int)Enums.TaskStatus.Started || StatusID == (int)Enums.TaskStatus.Finished)
{
return true;
}
return IsTicket && StatusID == (int)Enums.TicketStatus.InProgress || StatusID == (int)Enums.TicketStatus.Closed;
}
}
public bool EndEnabled
{
get
{
if (IsTask && StatusID == (int)Enums.TaskStatus.Started || StatusID == (int)Enums.TaskStatus.Paused)
{
return true;
}
return IsTicket && StatusID == (int)Enums.TicketStatus.InProgress || StatusID == (int)Enums.TicketStatus.Assigned;
}
}
public bool InitialStatus => IsTask && StatusID == (int) Enums.TaskStatus.Created || IsTicket && StatusID == (int)Enums.TicketStatus.Assigned;
public bool Started => IsTask && StatusID == (int)Enums.TaskStatus.Started || IsTicket && StatusID == (int)Enums.TicketStatus.InProgress;
public bool Paused => IsTask && StatusID == (int)Enums.TaskStatus.Paused || IsTicket && StatusID == (int)Enums.TicketStatus.Assigned;
public bool Finished => IsTask && StatusID == (int)Enums.TaskStatus.Finished || IsTicket && StatusID == (int)Enums.TicketStatus.Closed;
public string ProductsLabel
{
get
{
return Products != null ? string.Join(", ", Products.Select(p => p.Name)) : "";
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
而在 TasksPage 中,父页面:
protected override async void OnAppearing()
{
_scheduledTasks = new ObservableCollection<TaskViewModel>(_schedule.ScheduledTasks.OrderBy(st => st.Finished));
TasksListView.ItemsSource = _scheduledTasks;
}
任务页面模型:
public class ScheduleDTO
{
public int ScheduleID { get; set; }
public DateTime ScheduleDate { get; set; }
public int WorkerID { get; set; }
public bool OnHoliday { get; set; }
public DateTime StartDatetime { get; set; }
public DateTime StopDatetime { get; set; }
public DateTime CurrentDateTime { get; set; }
public DateTime? LoggedInTime { get; set; }
public DateTime? LoggedOutTime { get; set; }
public string LateReason { get; set; }
public string EarlyLogoutReason { get; set; }
public string LateLogoutReason { get; set; }
// This should be the source for the Listview
public List<TaskViewModel> ScheduledTasks { get; set; }
}
最佳答案
我会建议将所有 View 逻辑放在 View 模型中。它会引发一些重构,但会更加简洁和可扩展。这样做,您只需将委托(delegate)从 TaskPageViewModel 传递到所有 TaskViewModel,这将触发所有其他任务的激活:
public class TaskPageViewModel
{
IApi _api;
public TaskPageViewModel(IApi api)
{
_api = api;
}
List<TaskViewModel> Tasks;
public void CreateTasks()
{
Tasks.Add(new TaskViewModel(OnTaskStatusChanged));
...
}
private void OnTaskStatusChanged(TaskViewModel selectedViewModel)
{
if (selectedViewModel.ModelType == Enums.ModelType.Task.ToString())
{
await _api.UpdateStatus(new StatusUpdateDTO
{ID = selectedViewModel.ID, ModelType = Enums.ModelType.Task.ToString(), StatusID = (int)Enums.TaskStatus.Started});
}
var taskStatus = selectedViewModel.Status;
foreach (var task in Tasks)
{
if (selectedViewModel != task)
{
task.IsEnable = taskStatus == Status.Pause || taskStatus == Status.End;
}
}
}
}
public class TaskViewModel
{
private readonly Action<TaskViewModel> _onTaskStatusChanged;
public TaskViewModel(Action<TaskViewModel> onTaskStatusChanged)
{
_onTaskStatusChanged = onTaskStatusChanged;
}
public ICommand TaskStatusChangedCommand;
public bool IsEnable;
public void TaskStatusChanged()
{
_onTaskStatusChanged(this);
}
}
然后您只需将 StatusChangedCommand 和 IsEnable 属性绑定(bind)到您的按钮和框 View 。您将在父 View 模型中拥有所有业务逻辑(api 调用)。
关于android - 如何在 Xamarin Forms 应用程序 (android) 中仅激活 1 个 ListView 项目并禁用其他项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57256139/
我的设置.py: LANGUAGE_CODE = 'de' TIME_ZONE = require_env("TIME_ZONE_IDENTIFIER") USE_I18N = True USE_L1
谁能给我解释一下 Django 的 forms.Form 和 forms.ModelForm 的相同点和不同点? 最佳答案 从 forms.Form 创建的表单由您手动配置。您最好将这些用于不直接与模
我在用 angularjs 构建的表单上遇到此错误。 `错误:[$compile:multidir] 多个指令 [form, form] 请求 'form' Controller :
我是 Spring 的新手,在尝试显示表单错误时遇到了一些麻烦。 我有以下表格: User Name:
我希望在提交表单时找出 spring:bind 和 form:form 标记库之间的区别。 我的 JSP 片段如下: ....
类型‘AbstractControl’上不存在属性‘Controls’。
有一个问题与此非常相似,但我想以不同的方式提出。 我是一个非常自定的人,但有时我确实喜欢走捷径。就这样吧。 我确实发现这两个类非常相似,尽管其中一个“帮助”程序员更快地编写代码或减少代码/重复代码。将
我在控制台中收到此错误。 “表单提交已取消,因为表单未连接” 自从我们将应用程序迁移到更新版本的 React 后,尝试将我的 redux-form 从 v5 迁移到 v6 之后。 我不确定这里出了什么
我想要的是一个表单,在提交时运行验证检查,并突出显示所有无效字段并添加工具提示。 我正在有效地寻找这样的东西: dojo.forEach(dijit.byId('myForm')._invalidWi
我需要设置symfony2表单元素的值。 我在 Controller 操作中使用了doctrine2实体, Symfony\Component\Form\AbstractType 和createFor
这是用于将数据提交到自定义列表的自定义 Editform.aspx。用户完成表单后,他应该能够点击按钮甚至“确定”按钮,并让 sharepoint 将表单数据提交到列表,然后重定向到项目显示表单 (d
我想知道在 spring 标签中编写所有表单是否是一种好习惯,或者我可以将 spring 表单标签与 html 表单标签混合使用吗? 最佳答案 当您需要 Spring 表单提供的功能时使用它们: 绑定
我正在构建动态表单并希望“即时”添加表单组。 这是我的代码,几乎可以工作: import {Component, OnInit} from '@angular/core'; import {FormG
表格 Form.Load 有什么区别? , Form.Shown和 Form.Activated事件?他们被解雇的顺序是什么? 最佳答案 参见 Windows Forms Events Lifecyc
我正在使用具有路线跟踪功能的 Xamarin Forms 开发一些应用程序。尽管我正在使用 AppCenter,即在 App.xaml.cs OnStart 我添加 protected asy
我正在实现一个 gameboy 模拟器,就像我之前的许多人一样。 我正在尝试实现 PPU 并为此使用代表屏幕的类。 // needed because VS can't find it as depe
我是 Orbeon Form 新手,想使用它。不过,我尝试过 Orbeon Form 网站上的 Form 示例,并用泰语输入了一些数据。是的,可以在“泰语”字段中输入数据。但是当我尝试生成“PDF”时
那么让表单一遍又一遍有效地呈现相同表单的最佳方法是什么,并根据实体的属性值有条件地禁用字段? 我有一个发票实体,需要一个用于创建发票的表单,以及在发票流程的各个阶段(生成、发送、支付等)禁用各个字段的
因此,我一直在与我的同事(开发人员和设计人员)就 Web 表单的自动填充工具进行亲切的辩论。这是一个重要的开发问题,因为它会影响表单的构建方式。 问)自动填充工具(例如 Google 工具栏或 Chr
那么让表单一遍又一遍有效地呈现相同表单的最佳方法是什么,并根据实体的属性值有条件地禁用字段? 我有一个发票实体,需要一个用于创建发票的表单,以及在发票流程的各个阶段(生成、发送、支付等)禁用各个字段的
我是一名优秀的程序员,十分优秀!