簡體   English   中英

從ViewModel WPF訪問可視子元素

[英]Access Visual child Elements from viewmodel wpf

我有一個如下視圖:我想在視圖模型的主窗口的列表視圖中訪問所有復選框。但是在主窗口的上下文中它可以正常工作。但是在視圖模型中如果我說IEnumerable<CheckBox> all = window.allboxes(); 它不起作用..請幫助..

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;
                }
            }
        }

    }
}

簡短的答案, 不要這樣做 ViewModel不應與View緊密耦合,而了解某個函數/集合肯定可以做到這一點。

長答案:

您的數據應包裝在“可選”版本中,該版本應包含一個表明已被選中的布爾值。 然后,您可以在綁定到該字段的項目模板中創建一個帶有CheckBoxItemsControl

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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM