属性 我的 collection 中可观察项目的变化未被绑定整个项目的 XAML 识别

Property changes in the observable items in my collection is not recognized by XAML binding the entire item

如果我绑定到整个项目,如何让我的 collection 可观察项目中的项目更新被识别?

我有一个 class Codec 实现 INotifyPropertyChanged:

public class Codec : INotifyPropertyChanged
{
  private bool _isEnabled;

  public bool IsEnabled
  {
    get => _isEnabled;
    set
    {
      _isEnabled = value;
      OnPropertyChanged();  // Raises PropertyChanged
    }
  }

  ...
}

然后我有一个 view-model,可观察到的 collection 为 Codec:s。

public class CodecsViewModel : INotifyPropertyChanged
{
  public ObservableCollection<Codec> Codecs { get; }

  ...
}

还有一个列出编解码器的视图,其中容器的可访问性字符串绑定到每个单独的 Codec 项目:

<CollectionView ItemsSource="{Binding Codecs}">
  <CollectionView.ItemTemplate>
    <DataTemplate>
      <StackLayout
        AutomationProperties.Name="{Binding ., Converter={StaticResource CodecPresenter}}">
        ...
      </StackLayout>
    </DataTemplate>
  </CollectionView.ItemTemplate>
<CollectionView>

当我更改单个 Codec 项目的 IsEnabled 状态时,我希望更新会触发对我的 CodecPresenter 转换器的新调用,以便 AutomationProperties.Name 属性 得到更新。然而,事实并非如此。

Codecs collection 上手动加注 PropertyChanged 没有帮助。有什么方法可以向 AutomationProperties.Name 绑定发出信号,表明尽管项目(参考)保持不变,但项目内容已更改?

为您的模型添加 Self 属性

public Codec Self {
    get {
        return this;
    }
}

public bool IsEnabled
  {
    get => _isEnabled;
    set
    {
      _isEnabled = value;
      OnPropertyChanged();  
      OnPropertyChanged(Self);
    }
  }

然后绑定到它

AutomationProperties.Name="{Binding Self, Converter={StaticResource CodecPresenter}}">
  

想法源自 Xamarin 论坛上的这个post