如何将 List 或 List 绑定到 UserControl.List

本文关键字:List 绑定 UserControl IInterfaceForT1 T2 T1 | 更新日期: 2023-09-27 17:56:43

我有一个接口和两个类。

public interface IFieldValue
{
  Int64 FieldId { get; set; }
  string Value { get; set; }
}
public class CarFieldValue : IFieldValue
{
  public Int64 CarId { get; set; }
  public Int64 FieldId { get; set; }
  public string Value { get; set; } 
}
public class HouseFieldValue : IFieldValue
{
  public Int64 HouseId { get; set; }
  public Int64 FieldId { get; set; }
  public string Value { get; set; } 
}

现在我有一个通用的用户控件,用于显示 CarHouse 的字段值。用户控件绑定到相应的视图模型。

public class CarViewModel : INotifyPropertyChanged
{
  (...)
  private ObservableCollection<CarFieldValue> _FieldValues;
  public ObservableCollection<CarFieldValue> FieldValues
  {
    get { return _FieldValues; }
    set
    {
      if (_FieldValues!= value)
      {
        _FieldValues= value;
        SendPropertyChanged("FieldValues");
      }
    }
  }
}

public class HouseViewModel : INotifyPropertyChanged
{
  (...)
  private ObservableCollection<HouseFieldValue> _FieldValues;
  public ObservableCollection<HouseFieldValue> FieldValues
  {
    get { return _FieldValues; }
    set
    {
      if (_FieldValues!= value)
      {
        _FieldValues= value;
        SendPropertyChanged("FieldValues");
      }
    }
  }
}

用户控件部分如下所示:

public IReadOnlyList<IFieldValues> FieldValues
{
  get { return (IReadOnlyList<IFieldValues>)GetValue(FieldValuesProperty); }
  set { SetValue(FieldValuesProperty, value); }
}
public static readonly DependencyProperty FieldValuesProperty = DependencyProperty.Register("FieldValues", typeof(IReadOnlyList<IFieldValues>), typeof(FieldValuesControl), new UIPropertyMetadata(null));

绑定在视图的 XAML 中进行,例如在 CarView 中:

<myCtrls:FieldValuesControl FieldValues="{Binding MyCarViewModel.FieldValues}" />

我在这里找到了该解决方案]1,到目前为止它仍然有效。但是我需要编辑(添加或删除)用户控件中的项目。当我使用 IList<IFieldValues> 而不是 IReadOnlyList<IFieldValues> 时,绑定不起作用。没有绑定错误/警告。

我也尝试ICollection<IFieldValues>但没有成功。我可以按照评论中的建议使用IEnumerable<IFieldValues>,但是我无法Add()项目,因为我无法投IEnumerable

如何实现此方案?

更新由于我没有找到更好的解决方案,我在 ViewModels 和用户控件上都使用了ObservableCollection<IFieldValues>。由于我的视图模型对列表没有太多作用,因此并不复杂。感谢您的帮助。

如何将 List<T1> 或 List<T2> 绑定到 UserControl.List<IInterfaceForT1

为什么在UserControl中不使用ObservableCollectionIEnumerable

像其他人一样:

  • 如何将集合绑定到 WPF 中的自定义控件

  • 用户控件中的 wpf 绑定集合属性

我认为你的问题和这里一样

问题出在您的DependencyProperty注册中。 Co-variance is not applicable for generic lists

另一种可能性是使用 ItemCollection 类。默认ItemsControl中使用相同的方法(请参阅代码)。