引发因索引器不工作而更改的属性

本文关键字:属性 工作 索引 | 更新日期: 2023-09-27 18:02:06

这段代码是一个Indexer和一个来自框架的事件,它们为XAML绑定引发属性更改事件。

我在索引器上绑定了一些XAML控件,绑定工作是因为它在初始化接口时在get中中断。但是,当我更改控件的值时,它在OnSomeBusinessCurrentEntityPropertyChanged方法中中断,并进入if条件并使用Indexer名称调用OnPropertyChanged事件。但是界面永远不会刷新。

一个奇怪的事情,是,首先,当我写这段代码,它是工作的UI刷新,然后在我重命名TotalDailyTotal,从那时起它停止工作。有人知道为什么索引器没有刷新吗?

下面是一个带有绑定的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")
}