2014-09-29 4 views
0

У меня есть вид следующим образом. Я хочу получить доступ ко всем флажкам в представлении главного окна в области просмотра. Но в контексте главного окна он отлично работает. .Но в модели представления, если я скажу IEnumerable<CheckBox> all = window.allboxes(); его не working..Please помощь ..Доступ к визуальным дочерним элементам из viewmodel 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

+0

На самом деле, я хочу получить ссылку на все отмеченные флажки в представлении списка, чтобы в режиме просмотра я мог получить соответствующие идентификаторы из наблюдаемой коллекции и сохранить их в базе данных. Вкратце получить идентификаторы всех отмеченных флажков. .Пожалуйста, помогите .. – nikhil

ответ

0

Короткий ответ, не делают этого. ViewModel не должен быть тесно связан с представлением, что, конечно же, знает о функции/коллекции.

Длинный ответ:

Ваши данные должны быть обернуты в версии «Возможность выбора», который включает в себя логическое значение, указывающее, что выбран. Затем вы можете создать ItemsControl с CheckBox в шаблоне элемента, привязанного к этому полю.

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

Теперь, когда вам нужно получить все выбранные элементы, вы просто пишете:

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

Чтобы получить идентификаторы:

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

Ваше мнение представляет данные в представлении модель, вы должны никогда не должны непосредственно манипулировать пользовательским интерфейсом из модели просмотра.

+0

В основном у меня есть модель в виде платформы Entity Framework и модели представления, которая имеет свойства id, name в коллекции и эту коллекцию, привязанную к элементу управления списком, с настраиваемыми флажками для каждой строки. Теперь, если флажок установлен, как мне получить соответствующий идентификатор этого флажка. Пожалуйста, помогите .. Я попытался подключить вышеуказанный код, но Collection.Where (i => i.Selected) Выбранное свойство недоступно. – nikhil

+0

@nikhil Вместо того, чтобы держать EF DTO в вашей коллекции, вам нужно обернуть его в класс «Selectable», аналогичный тому, который я опубликовал. Это имеет смысл? – BradleyDotNET

+0

Да, конечно, Брэдли благодарит вас за вашу помощь. На самом деле я изменил структуру хранимой процедуры и добавил столбцы ischecked. И им сопоставляя эту процедуру с таблицей, мне действительно нужно вставить данные, когда установлен флажок. Теперь он работает. Большое спасибо за вашу помощь. Bradely .. – nikhil