【发布时间】:2016-07-12 08:09:41
【问题描述】:
我有一个接口和两个类。
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 的字段值。用户控件绑定到相应的 ViewModel。
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 中,例如在汽车视图中:
<myCtrls:FieldValuesControl FieldValues="{Binding MyCarViewModel.FieldValues}" />
我在这里找到了该解决方案]1 并且到目前为止有效。但我需要编辑(添加或删除)用户控件中的项目。
当我使用 IList<IFieldValues> 而不是 IReadOnlyList<IFieldValues> 时,绑定不起作用。没有绑定错误/警告。
我也试过ICollection<IFieldValues>,但没有成功。
我可以按照 cmets 中的建议使用 IEnumerable<IFieldValues>,但我不能使用 Add() 项目,因为我无法投射 IEnumerable。
如何实现这个场景?
更新
由于我没有找到更好的解决方案,我在 ViewModel 和用户控件上都使用了ObservableCollection<IFieldValues>。由于我的 ViewModels 对列表没有太多作用,所以它并不复杂。感谢您的帮助。
【问题讨论】:
-
只是在黑暗中拍摄 - 您是否尝试过指定 OneWay 绑定?
-
@LordWilmore OneWay 没有帮助。
-
@Clemens:是的,
IEnumerable<IFieldValues> does work, but I need to add/remove items in the usercontrol. I cant 将IEnumerable转换为List或ObservableCollection。抱歉,我会在问题中更清楚地说明这一点。 -
如果需要在用户控件中添加项目,不能对专门的列表进行操作。但是,您可以将列表项的副本保存在匹配类型的单独列表中。类似
List<IFieldValues> items = srcList.Cast<IFieldValues>().ToList()
标签: c# wpf data-binding