I have model class and interface:
public interface IEntity
{
int ID { get; set; }
}
public class Entity : IEntity
{
public int ID { get; set; }
}
I have ViewModel interface:
public interface IEntityListViewModel
{
RangeObservableCollection<IEntity> Items { get; set; }
IEntity SelectedItem { get; set; }
void LoadItems();
}
I need a ViewModel base class:
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);
}
}
Of course, the compiler requires the implementation of IEntityListViewModel.Items!
I could do:
public interface IEntityListViewModel<T> where T : IEntity
{
RangeObservableCollection<T> Items { get; set; }
T SelectedItem { get; set; }
void LoadItems();
}
But I have another class:
public abstract class UserControlBase : UserControl
{
public IEntityListViewModel VM { get; set; }
public virtual void UserControl_Loaded(object sender, RoutedEventArgs e)
{
VM.LoadItems();
}
}
I need UserControlBase because my ViewModels have many events, and in UserControlBase I want to subscribe to them.
I could do:
public IEntityListViewModel<T> VM { get; set; }
but then I must have UserControlBase<T>. I do not like this.
How do I inherit EntityListViewModel<T> from IEntityListViewModel? Or is there some other solution?