我有模型类和接口:
A
[[-1.086 0.997]
[ 0.283 -1.506]
[-0.579 1.651]]
A_linv.dot(A)
[[ 1. -0.]
[ 0. 1.]]
我有ViewModel接口:
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();
}
当然,编译器需要实现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();
}
}
因为我的ViewModel有很多事件,而UserControlBase
我想订阅它们。
我能做到:
UserControlBase
然后我必须public IEntityListViewModel<T> VM { get; set; }
。我不喜欢这个。
如何从UserControlBase<T>
继承EntityListViewModel<T>
?还是有其他解决方案吗?
答案 0 :(得分: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;
}
}
为了避免每次需要更改为IEnumerable<T>
时都必须创建新的RangeObservableCollection。另一个问题是,始终进行强制转换可能会花费很多。此外,你没有提到将在前端绑定哪个集合(我假设你将要做的事情),基于可以进行一些优化。
答案 1 :(得分:0)
我有点混淆这个问题,但我会试着回答。
如何从IEntityListViewModel继承EntityListViewModel
基于代码,我认为这就是你想要的东西
public abstract class EntityListViewModel<T> where T : IEntity, EntityListViewModel
这是实现目标的最简单方法,而不会强迫您在UserControlBase类中实现泛型。