2013-07-08 2 views
0

Я искал решение за полтора дня. Большинство примеров, которые я получаю, объясняют/объясняют ситуацию, относятся к выкладке со статическими элементами типа. У меня есть следующая структура.Комбинация связывания с использованием DataTemplate of ItemsControl

  • DataModel Item

  • ObservableCollection CombinedData внутри DataFilter класса (т.е. имеет другие свойства, в том числе "ParentName используется для buttoncontent")

  • ObservableCollection Фильтры внутри DataFilterGroup класса

  • DataFilterGroup является 1 в DataViewModel

Таким образом, DataContext окна является DataViewModel.

У меня есть DataTemplate, в котором я хотел бы показать элементы DataFilterGroup из кода за

Здесь мне нужна помощь, пожалуйста !!

так в основном: ItemSource ItemsControl является связан с DataFilterGroup

Как я связать выпадающий в DataFilter так, что это точка детали источник DataFilter. Поэтому источник изменится (или содержимое поля со списком изменится с каждым элементом DataFilterGroup).

Прошу прощения, если это вопрос повторения. То, что у меня есть до сих пор, является следующим (и попробовал несколько способов привязки выпадающего списка, но никаких элементов не появилось. Удивительно достаточно, чтобы появился Buttoncontent. Специальная комбо - это управляющая команда Combobox, которая представляет собой кнопку и поле со списком.

private static DataTemplate DataFilterTemplate 
{ 
    get 
    { 
     DataTemplate DFT = new DataTemplate(); 
     DFT.DataType = typeof(DataFilters); 

     FrameworkElementFactory Stack = new FrameworkElementFactory(typeof(VirtualizingStackPanel)); 
     Stack.SetValue(VirtualizingStackPanel.DataContextProperty, new Binding()); 
     Stack.SetValue(VirtualizingStackPanel.OrientationProperty, Orientation.Horizontal); 

     FrameworkElementFactory Item = new FrameworkElementFactory(typeof(SpecialCombo)); 
     //Item.SetValue(SpecialCombo.DataContextProperty, new Binding()); 
     Item.SetValue(SpecialCombo.ButtonContentProperty, new Binding("ParentName")); 

     Binding b = new Binding("CombinedData"); 

     //b.RelativeSource.AncestorType = typeof(ItemsControl); 

     Item.SetBinding(SpecialCombo.ItemsSourceProperty, b); 
     //Item.SetValue(SpecialCombo.ItemsSourceProperty, new Binding("CombinedData")); 
     Item.SetValue(SpecialCombo.DisplayMemberPathProperty, "FullName"); 
     Item.SetValue(SpecialCombo.SelectedValuePathProperty, "Index"); 
     Item.SetValue(SpecialCombo.SelectedValueProperty, "SelectedItem"); 
     Item.SetValue(SpecialCombo.ToggleVisibleProperty, new Binding("ComboVisibility")); 
     //Item.SetValue(SpecialCombo.SelectedValueProperty, new Binding("SelectedItem")); 

     Stack.AppendChild(Item); 

     DFT.VisualTree = Item; 

     return DFT; 
    } 
} 

Ребенок ItemsControl

Child.ItemsSource = DVM.Filters.FullCollection; 
Child.ItemTemplate = DataFilterTemplate; 

ответ

0

Благодаря Punker 76 в другом посте, где я реорганизованной вопрос (здесь ->Can one bind a combobox Itemssource from a datatemplate of a ItemsControl). немного следующее должно было быть сделано

(1) в DataFilters Объект должен был перейти от [cre ция объекта зависимости]

public class DataFilters : INotifyPropertyChanged 
// to 
public class DataFilters : DependencyObject 

(2) Observalbe коллекция также следует изменить. так

public ObservableCollection<DataModel> CombinedData; 
// should become 
public static readonly DependencyProperty CombinedData= DependencyProperty.Register("CombinedData", typeof(ObservableCollection<DataModel>), typeof(DataFilters), new FrameworkPropertyMetadata()); 

//and 
public ObservableCollection<DataModel> CombinedData 
{ 
    get { return (ObservableCollection<DataModel>)GetValue(CombinedDataProperty); } 
    set { SetValue(CombinedDataProperty, value); } 
} 

(3) Правильный Binding в DataTemplate становится

Item.SetBinding(SpecialCombo.ItemsSourceProperty, new Binding("CombinedData")); 

Это все основные шаги, чтобы получить объект типа выпадающий быть привязки данных в DataTemplate

Смежные вопросы