引发因索引器不工作而更改的属性
本文关键字:属性 工作 索引 | 更新日期: 2023-09-27 18:02:06
这段代码是一个Indexer和一个来自框架的事件,它们为XAML绑定引发属性更改事件。
我在索引器上绑定了一些XAML控件,绑定工作是因为它在初始化接口时在get中中断。但是,当我更改控件的值时,它在OnSomeBusinessCurrentEntityPropertyChanged
方法中中断,并进入if
条件并使用Indexer名称调用OnPropertyChanged
事件。但是界面永远不会刷新。
一个奇怪的事情,是,首先,当我写这段代码,它是工作的UI刷新,然后在我重命名Total
到DailyTotal
,从那时起它停止工作。有人知道为什么索引器没有刷新吗?
下面是一个带有绑定的XAML控件的例子:
<max:MaxLabel x:Name="tbnTotalHour1" max:CustomBindingBehavior.IsCustomBindingIgnored="True" Content="{Binding Path=[0], Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
代码:
protected override void OnSomeBusinessCurrentEntityPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnSomeBusinessCurrentEntityPropertyChanged(sender, e);
if (sender is TimeSheet)
this.OnPropertyChanged("Total[]")
}
[IndexerName("Total")]
public long this[int dateModifier]
{
get
{
var date = this.WorkingEntity.PayrollPeriodStartDate.AddDays(dateModifier);
TimeSpan total = TimeSpan.Zero;
foreach (var view in this.CurrentWorkingTimesheetByActivity.ViewList)
{
var detail = view.Details[date];
if (detail != null)
total += detail.TimeSheet.Duration;
}
return total.Ticks;
}
}
绑定系统正在查找一个名为"Item[]"的属性,该属性由常量字符串binding . indexername定义。在您自己的setter中,notify看起来像这样:
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(Binding.IndexerName));
}
Just Update your code:
protected override void OnSomeBusinessCurrentEntityPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnSomeBusinessCurrentEntityPropertyChanged(sender, e);
if (sender is TimeSheet)
this.OnPropertyChanged(Binding.IndexerName)
}
编辑
如果你想使用你自定义的索引器名称,我自己猜了很多次后发现了这个方法:
用IndexerName属性装饰你的属性
使用索引器名称更改XAML绑定:
<max:MaxLabel x:Name="tbnTotalHour1" max:CustomBindingBehavior.IsCustomBindingIgnored="True" Content="{Binding Path=Total[0], Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
在raise of the Changes中,使用不带'[]'的索引器名称
protected override void OnSomeBusinessCurrentEntityPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnSomeBusinessCurrentEntityPropertyChanged(sender, e);
if (sender is TimeSheet)
this.OnPropertyChanged("Total")
}