我经常遇到这样的情况,我希望有一个3-State复选框来选择/取消选择我所有的视图模型。我在创建一个可重用的类来做这件事时遇到了困难。
我尝试创建以下基类:
public class SelectAllListVM
{
public List<SelectableVM> ChildList = new List<SelectableVM>();
public bool? SelectAll // call UpdateSelectedChildren on set
internal void UpdateSelectAll ()
// Set SelectAll based on ChildList elements
// true = all selected, false = non selected, null = some selected
private void UpdateSelectedChildren () {
foreach ( SelectableVM vm in ChildList )
vm.SetIsSelected( SelectAll.Value );
}
}
public class SelectableVM
{
public SelectableVM (SelectAllListVM parentVM) {}
public bool IsSelected // call parentVM.UpdateSelectAll
}这样做的问题是,每次我想遍历ChildList时,我都必须将SelectableVM转换为它的具体实现。如何重用此行为并避免强制转换?
发布于 2011-08-31 04:34:40
您可以创建一个接口ISelectableVM
public interface ISelectableVM
{
public bool IsSelected;
}并在派生类中实现它。
public class SelectableVM : ISelectableVM
{}
public class OtherSelectableVM : ISelectableVM
{}那么在你的ParentVM中,你就不需要强制转换:
public class SelectAllListVM
{
public List<ISelectableVM> ChildList = new List<ISelectableVM>();
public bool? SelectAll; // call UpdateSelectedChildren on set
private void UpdateSelectedChildren()
{
foreach (ISelectableVM vm in ChildList)
vm.IsSelected = SelectAll.Value;
}
}除了interface之外,您还可以使用
public class BaseSelectableVM
{
public bool IsSelected;
}并从中派生出。
发布于 2011-08-31 07:17:58
为了做到这一点,我曾经做过一些附加行为的把戏。一切都是由视图处理的,不需要VM关心select all逻辑。我写了三个部分(part 1,part 2,part 3)的细节。我把代码放在了fileden...and上,后来因为登录次数不够多而丢失了。但是所有的代码都在这三篇文章中。
https://stackoverflow.com/questions/7249092
复制相似问题