2016-07-12 4 views
1

У меня есть интерфейс и два класса.Как связать список <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 мало что делают с списками, это не сложно. Спасибо за вашу помощь.

+0

Просто выстрел в темноте - вы пробовали указать привязку OneWay? – LordWilmore

+1

@LordWilmore OneWay не помогает. – gumo

+0

@Clemens: Да, 'IEnumerable работает, но мне нужно добавить/удалить элементы в usercontrol. Я не могу использовать 'IEnumerable' там' List' или 'ObservableCollection'. Извините, сделайте это более ясным в вопросе. – gumo

ответ

0

Почему вы не используете ObservableCollection или IEnumerable в своем UserControl?

Как и другие делают:

И я думаю, ваша проблема такая же, как here

Problem is in your DependencyProperty registration. Co-variance is not applicable for generic lists

Другой возможностью было бы использовать класс ItemCollection. То же самое используется по умолчанию ItemsControl (см. code).

+0

Использование 'ObservableCollection' приводит к ошибкам привязки, потому что вы не можете связывать явный' ObservableCollection 'соответственно' ObservableCollection < HouseFieldValues> 'в общий« ObservableCollection ». 'IEnumerable' и' IList' тоже не работают. Только «IReadOnlyList». Я еще не понял разницы. – gumo

+0

@gumo Вы пробовали 'ObservableCollection '? –

+0

Использование 'object' имеет ту же ошибку привязки, что и' ObservableCollection '" System.Windows.Data Error: 1: Не удается создать конвертер по умолчанию для выполнения односторонних конверсий между типами ObservableCollection'1 [CarFieldValue] и 'ObservableCollection'1 [Object]'. Рассмотрим использование свойства Converter Binding ... " – gumo

Смежные вопросы