Как использовать INotifyPropertyChanged для обновления привязки массива? - PullRequest
14 голосов
/ 18 сентября 2008

Допустим, у меня есть класс:

class Foo
{
  public string Bar
  {
    get { ... }
  }

  public string this[int index]
  {
    get { ... }
  }
}

Я могу связать эти два свойства, используя "{Binding Path = Bar}" и "{Binding Path = [x]}". Хорошо.

Теперь предположим, что я хочу реализовать INotifyPropertyChanged:

class Foo : INotifyPropertyChanged
{
  public string Bar
  {
    get { ... }
    set
    {
      ...

      if( PropertyChanged != null )
      {
        PropertyChanged( this, new PropertyChangedEventArgs( "Bar" ) );
      }
    }
  }

  public string this[int index]
  {
    get { ... }
    set
    {
      ...

      if( PropertyChanged != null )
      {
        PropertyChanged( this, new PropertyChangedEventArgs( "????" ) );
      }
    }
  }

  public event PropertyChangedEventHandler PropertyChanged;
}

Что идет в части, отмеченной ????? (Я пробовал string.Format ("[{0}]", index), и он не работает). Это ошибка в WPF, есть ли альтернативный синтаксис, или просто INotifyPropertyChanged не так мощен, как обычное связывание?

Ответы [ 4 ]

13 голосов
/ 18 сентября 2008

Благодаря предложению Кэмерона я нашел правильный синтаксис:

Item[]

Который обновляет все (все значения индекса), связанные с этим индексированным свойством.

6 голосов
/ 08 мая 2012

Избегая строк в вашем коде, вы можете использовать константу Binding.IndexerName, которая фактически "Item[]"

new PropertyChangedEventArgs(Binding.IndexerName)
5 голосов
/ 28 апреля 2009
PropertyChanged( this, new PropertyChangedEventArgs( "Item[]" ) )

для всех индексов и

PropertyChanged( this, new PropertyChangedEventArgs( "Item[" + index + "]" ) )

за один предмет

привет, Джерод

3 голосов
/ 18 сентября 2008

Не знаю точно, сработает ли это, но рефлектор показывает, что методы get и set для индексированного свойства называются get_Item и set_Item. Возможно, вы могли бы попробовать Item и посмотреть, сработает ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...