2016-08-12 2 views
1

У меня есть этот код Indexer и событие из нашей структуры, которые повышают событие изменения свойства для привязки XAML.Raise свойство изменено для индексатора не работает

Я привязал элемент управления XAML к индексу, работа по связыванию приводит к его разрыву в get при инициализации интерфейса. Но, когда я изменяю значение элемента управления, он разбивается на OnSomeBusinessCurrentEntityPropertyChanged и вводит условие if и вызывает событие OnPropertyChanged с именем Indexer. Но интерфейс никогда не обновляется.

Одна из самых странных вещей - это то, что сначала, когда я писал этот код, он работал, пользовательский интерфейс был освежающим, после того как я переименовал Total в DailyTotal и с тех пор он прекратил работать. Кто-нибудь знает, почему Indexer не обновляется.

Вот Exemple моего контроля 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

Мне нравится, как люди downvote, не давая любые комментарии. Я думаю, что мой вопрос довольно законный. –

+0

Упрощенный для полезного и ясного вопроса. – jonathana

ответ

1

Связывающую система ищет свойство с именем "Пункт []", определяется константой string Binding.IndexerName. В вашем собственном инкубаторе, то оповещать будет выглядеть примерно так:

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) 
} 

EDIT

Если вы хотите использовать пользовательское имя Индексатор, я основанный таким образом самостоятельно после многих догадок:

Украсьте свою собственность с помощью IndexerName Атрибут.

Изменение XAML Связывание с вашим именем индексатор:

<max:MaxLabel x:Name="tbnTotalHour1" max:CustomBindingBehavior.IsCustomBindingIgnored="True" Content="{Binding Path=Total[0], Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" /> 

И в Поднятие Изменений просто использовать имя индексатор без «[]»

protected override void OnSomeBusinessCurrentEntityPropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    base.OnSomeBusinessCurrentEntityPropertyChanged(sender, e); 
    if (sender is TimeSheet) 
     this.OnPropertyChanged("Total") 
} 
+0

Он работает после того, как я удалил IndexerName над моим индексом. Позаботьтесь, чтобы объяснить мне, почему 'Item []' работал, но не 'Total []'? –

+0

Я предпочитаю использовать 'Binding.IndexerName' –

+0

Да, но почему' Item [] 'работает (поскольку' Binding.IndexerName' является просто константой). но 'Total []' с атрибутом, который говорит, что мое IndexerName - 'Total', не было? Мне любопытно узнать. –

Смежные вопросы