如何将 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; }
}
现在我有一个通用的用户控件,用于显示 Car
或 House
的字段值。用户控件绑定到相应的视图模型。
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>
。由于我的视图模型对列表没有太多作用,因此并不复杂。感谢您的帮助。
为什么在UserControl
中不使用ObservableCollection
或IEnumerable
?
像其他人一样:
-
如何将集合绑定到 WPF 中的自定义控件
-
用户控件中的 wpf 绑定集合属性
我认为你的问题和这里一样
问题出在您的DependencyProperty
注册中。 Co-variance is not applicable for generic lists
另一种可能性是使用 ItemCollection
类。默认ItemsControl
中使用相同的方法(请参阅代码)。
本文关键字: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; }
}
现在我有一个通用的用户控件,用于显示 Car
或 House
的字段值。用户控件绑定到相应的视图模型。
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>
。由于我的视图模型对列表没有太多作用,因此并不复杂。感谢您的帮助。
为什么在UserControl
中不使用ObservableCollection
或IEnumerable
?
像其他人一样:
-
如何将集合绑定到 WPF 中的自定义控件
-
用户控件中的 wpf 绑定集合属性
我认为你的问题和这里一样
问题出在您的
DependencyProperty
注册中。Co-variance is not applicable for generic lists
另一种可能性是使用 ItemCollection
类。默认ItemsControl
中使用相同的方法(请参阅代码)。