2017-02-06 3 views
0

я класс модели и интерфейс:Наследование родовое-класс от необщего интерфейса

public interface IEntity 
{ 
    int ID { get; set; } 
} 

public class Entity : IEntity 
{ 
    public int ID { get; set; } 
} 

У меня есть интерфейс ViewModel:

public interface IEntityListViewModel 
{ 
    RangeObservableCollection<IEntity> Items { get; set; } 
    IEntity SelectedItem { get; set; } 

    void LoadItems(); 
} 

Мне нужен ViewModel базовый класс:

public abstract class EntityListViewModel<T> : IEntityListViewModel where T : IEntity 
{ 
    public RangeObservableCollection<T> Items { get; set; } 
    public T SelectedItem { get; set; } 

    public EntityListViewModel() 
    { 
     Items = new RangeObservableCollection<T>(); 
    } 

    protected abstract List<T> GetEntities(); 

    public void LoadItems() 
    { 
     var lst = GetEntities(); 
     Items.ReplaceRange(lst); 
    } 
} 

Конечно, для компилятора требуется реализация IEntityListViewModel.Items!

я мог бы сделать:

public interface IEntityListViewModel<T> where T : IEntity 
{ 
    RangeObservableCollection<T> Items { get; set; } 
    T SelectedItem { get; set; } 

    void LoadItems(); 
} 

Но у меня есть еще один класс:

public abstract class UserControlBase : UserControl 
{ 
    public IEntityListViewModel VM { get; set; }   

    public virtual void UserControl_Loaded(object sender, RoutedEventArgs e) 
    { 
     VM.LoadItems(); 
    }   
} 

Мне нужно UserControlBase, потому что мои ViewModels есть много событий, и в UserControlBase я хочу подписаться на них. я мог бы сделать:

public IEntityListViewModel<T> VM { get; set; } 

, но тогда я должен иметь UserControlBase<T>. Мне это не нравится.

Как наследовать EntityListViewModel<T> от IEntityListViewModel? Или есть другое решение?

ответ

1

Вы могли бы сделать что-то вроде этого

RangeObservableCollection<IEntity> IEntityListViewModel.Items 
    { 
     get 
     { 
      return new RangeObservableCollection<IEntity>(Items.Cast<IEntity>()); 
     } 

     set 
     { 
      Items = new RangeObservableCollection<T>(value.Cast<T>()); 
     } 
    } 

    IEntity IEntityListViewModel.SelectedItem 
    { 
     get 
     { 
      return SelectedItem; 
     } 

     set 
     { 
      SelectedItem = (T)value; 
     } 
    } 

Чтобы избежать необходимости создавать новые RangeObservableCollection каждый раз, когда вам нужно будет изменить, чтобы IEnumerable<T>. Другая проблема заключается в том, что это может стать дорогостоящим, чтобы делать трансляцию в любое время. Кроме того, вы не указали, какая коллекция будет привязана к интерфейсу (я предполагаю, что это то, что вы собираетесь делать), основываясь на том, что могут быть сделаны некоторые оптимизации.

0

Я немного запутался в этом вопросе, но я постараюсь ответить.

Как я наследовать EntityListViewModel от IEntityListViewModel

На основе кода, я думаю, что это то, что вы хотите, я думаю,

public abstract class EntityListViewModel<T> where T : IEntity, EntityListViewModel 

Это самый простой способ для достижения этой цели, не заставляя вас внедрять общий класс в классе UserControlBase.

+0

У меня нет класса 'EntityListViewModel'. Что это? –

+0

Это интерфейс IEntityListViewModel, typo :) – jtabuloc

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