У меня есть интерфейс и два класса.Как связать список <T1> или List <T2> с UserControl.List <IInterfaceForT1AndT2>?
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; }
}
Теперь у меня есть общий UserControl для отображения значения полей либо 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");
}
}
}
}
UserControl часть выглядит следующим образом:
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 и она работает до сих пор. Но мне нужно отредактировать (добавить или удалить) элементы в usercontrol. Когда я использую IList<IFieldValues>
вместо IReadOnlyList<IFieldValues>
, переписка не работает. Ошибок/предупреждений привязки нет.
Я также пробовал ICollection<IFieldValues>
без успеха. Я мог бы использовать IEnumerable<IFieldValues>
, как это предложено в комментариях, но тогда я не могу Add()
элементов, потому что я не могу отличить IEnumerable
.
Как я могу реализовать этот сценарий?
Update Поскольку я не нашел лучшего решения я использую ObservableCollection<IFieldValues>
на обоих ViewModels и UserControl. Поскольку мои ViewModels мало что делают с списками, это не сложно. Спасибо за вашу помощь.
Просто выстрел в темноте - вы пробовали указать привязку OneWay? – LordWilmore
@LordWilmore OneWay не помогает. – gumo
@Clemens: Да, 'IEnumerable работает, но мне нужно добавить/удалить элементы в usercontrol. Я не могу использовать 'IEnumerable' там' List' или 'ObservableCollection'. Извините, сделайте это более ясным в вопросе. –
gumo