【发布时间】:2019-12-04 21:23:05
【问题描述】:
我一直在研究这个问题,但发现了十几个似乎不太正确的答案。我正在尝试做的似乎是一个常见的用例,但我没有找到一个简单的答案。
我在下面有一个 .razor 文件,它的格式很小,有一个开始日期时间和一个持续时间。我想在其中任何一个更改时更新 EndDate 属性——主要是当我卡住时我从 Duration <select> 开始。 (暂时忽略 Telerik 的东西,只是要了解它在绑定的 startDate 属性中给了我一个 DateTime 值)。
在<select> 中使用@bind 会排除在同一元素上使用@onchange...所以,好吧,我可能想要一些能够响应属性值变化的东西...好吧,INotifyPropertyChanged用于那个,我开始走那条路,但它似乎与这种预先存在的数据绑定机制格格不入。我在EventCallback 上找到了文档,但这似乎是为组件间通信而设计的,而不是在组件内,我会硬塞进去。我可以在属性上定义设置器,但这在上下文中似乎也过时了......
在 Ember 中,我会为此使用依赖属性。我是否错过了在 Blazor 中执行此操作的预期方式? INotifyPropertyChanged 是正确的方式吗?
@page "/"
@using System.ComponentModel
@using System.Runtime.CompilerServices
@using Envoi.BlazorApp.Annotations
@using Telerik.Blazor.Components
<h1>Record Encounter</h1>
<TelerikDateTimePicker Min="@Min" Max="@Max" @bind-Value="@startDate"
Format="ddMMM yyyy HH:mm:ss" Width="220px"></TelerikDateTimePicker>
Duration:
<select @bind="Duration">
<option value="5">5 Minutes</option>
<option value="15">15 Minutes</option>
<option value="30">30 Minutes</option>
<option value="60">1 Hour</option>
<option value="120">2 Hours</option>
</select>
End: @(endDate.ToShortDateString()) @(endDate.ToShortTimeString())
(@(startDate.ToShortDateString()) @(startDate.ToShortTimeString()) + @Duration minutes)
@code
{
private DateTime startDate = DateTime.Now;
public DateTime Min = new DateTime(2006, 10, 1, 0, 0, 0);
public DateTime Max = new DateTime(DateTime.Now.Ticks + TimeSpan.FromDays(365.25*4).Ticks);
public int Duration { get; set; } = 5;
public DateTime endDate;
private void UpdateEndDate() // How to get this method called?
{
endDate = new DateTime(startDate.Ticks + TimeSpan.FromMinutes(Duration).Ticks);
}
}
【问题讨论】:
标签: c# data-binding blazor-server-side