我的代码是一个Indexer和来自我们框架的事件,它引发了XAML绑定的属性更改事件。
我在索引器上绑定了一些XAML控件,绑定工作导致它在初始化接口时在get中断。但是,当我更改控件的值时,它会在OnSomeBusinessCurrentEntityPropertyChanged
方法中断,并输入if
条件并使用索引器名称调用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;
}
}
答案 0 :(得分:2)
绑定系统正在查找名为&#34; Item []&#34;的属性,由常量字符串Binding.IndexerName定义。在您自己的setter中,通知看起来像这样:
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(Binding.IndexerName));
}
只需更新您的代码:
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}" />
在提升修改中,只需使用索引器名称,而不是&#39; []&#39;
protected override void OnSomeBusinessCurrentEntityPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnSomeBusinessCurrentEntityPropertyChanged(sender, e);
if (sender is TimeSheet)
this.OnPropertyChanged("Total")
}