需要可重用的SelectAll ViewModel

时间:2011-08-30 20:02:12

标签: wpf silverlight mvvm

我经常遇到一些情况,我希望有一个3状态复选框来选择全部/取消选择我的所有视图模型。我在创建可重用的类时遇到了困难。

我尝试创建以下基类:

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转换为它的具体实现。如何重用此行为并避免强制转换?

2 个答案:

答案 0 :(得分:1)

您可以创建一个Interface 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;
}

并从中衍生出来。

答案 1 :(得分:1)

我在当天做了一些附加的行为诡计来做这件事。一切都由视图处理,VM无需关心选择所有逻辑。我分三部分写了详细信息(part 1part 2part 3)我在fileden上提供了代码...然后丢失了因为我没有登录帐户足够多次。但是这三个帖子中的所有代码都在那里。