提升属性已更改为索引器无法正常工作

时间:2016-08-12 15:49:34

标签: c# wpf xaml

我的代码是一个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;
    }
}

1 个答案:

答案 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")
}