从viewmodel wpf访问Visual子元素

时间:2014-09-29 18:41:16

标签: c# wpf mvvm

我有一个视图如下..我想访问viewmodel中主窗口列表视图中的所有复选框。但是在主窗口的上下文中它工作正常..但是在视图模型中如果我说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;
                }
            }
        }

    }
}

1 个答案:

答案 0 :(得分: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。