2014-09-29 63 views
0

我有一個視圖如下..我想訪問viewmodel中主窗口的列表視圖中的所有複選框。但在主窗口的上下文中,它工作正常。 。但在視圖模型,如果我說IEnumerable<CheckBox> all = window.allboxes();它不是working..Please幫助..從視圖模型訪問視覺子元素wpf

public partial class MainWindow : Window 
{ 


    public MainWindow() 
    { 
     InitializeComponent(); 

     EntityViewModel ev = new EntityViewModel(); 
     this.DataContext = ev; 


    } 

    public IEnumerable<CheckBox> allboxes() 
    { 
     IEnumerable<CheckBox> myboxes = FindVisualChildren<CheckBox>(this); 
     return myboxes; 
    } 


    public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject 
    { 
     if (depObj != null) 
     { 
      for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 
      { 
       DependencyObject child = VisualTreeHelper.GetChild(depObj, i); 
       if (child != null && child is T) 
       { 
        yield return (T)child; 
       } 

       foreach (T childOfChild in FindVisualChildren<T>(child)) 
       { 
        yield return childOfChild; 
       } 
      } 
     } 

    } 
} 
+0

你試圖這樣做的事實告訴我你做錯了。你真的想要解決什麼問題?一個適當的MVVM設置將不需要這種類型的代碼。 – BradleyDotNET 2014-09-29 18:42:01

+0

其實我想獲取列表視圖中所有選中的複選框的引用,以便在視圖模型中,我可以從可觀察集合中檢索相應的ID並將它們存儲到數據庫中。簡而言之,獲取所有選中複選框的ID。 。請幫助.. – nikhil 2014-09-29 18:56:43

回答

0

簡短的回答,不這樣做。 ViewModel不應該與View緊密結合,因爲它知道函數/集合當然可以做到。

龍答:

您的數據應以「可選」版本,其中包括一個布爾值,表明它已被選中包裹起來。然後,您可以在綁定到此字段的項目模板中創建ItemsControl,CheckBox

public class Selectable<T> 
{ 
    public bool Selected {get; set;} 
    public T Data {get; set;} 
} 

現在,當你需要獲得所有被選中的項目,你只寫:

MyItems.Where(i => i.Selected); 

要獲取的ID:

MyItems.Where(i => i.Selected).Select(i => i.Data.ID); 

你的觀點代表在視圖中的數據模型,你應該從來沒有必須直接從視圖模型的UI操縱。

+0

基本上我有一個模型作爲實體框架和視圖模型,它具有集合中的id,name屬性,並且該集合綁定到列表視圖控件,每個行都使用自定義複選框。現在,如果複選框被選中,我該如何獲得該複選框的相應ID ..請幫助..我嘗試插入上面的代碼,但Collection.Where(i => i.Selected)所選屬性無法訪問。 – nikhil 2014-09-29 19:19:09

+0

@nikhil而不是在你的集合中保存EF DTO,你需要將它包裝在一個'Selectable'類中,類似於我發佈的類。這有道理嗎? – BradleyDotNET 2014-09-29 20:17:57

+0

是的,肯定布拉德利非常感謝你的幫助。實際上,我改變了我的存儲過程結構,並添加了一個缺陷列。與im相關的程序與表格實際上需要插入數據時,複選框檢查..它的工作現在..非常感謝您的幫助Bradely .. – nikhil 2014-09-30 19:23:18