2013-07-08 2 views
1

Я по-прежнему вижу себя как начинающий разработчик, когда дело доходит до wpf. Я хотел бы знать 2 вещиDataBinding a ItemsSource in the ItemsControl

  1. где я пошло не так или
  2. как можно устранить, чтобы найти решение.

Ситуация: [DATA part] У меня: Объект DataModel. Объект DataFilter, который представляет собой в основном набор DataModels + добавленных функций. и DataFiltersGroup, которая используется в DataViewModel и имеет набор DataFilters. У меня есть объект DataViewModel, который является в основном наблюдаемым набором элементов. Я хочу отображать каждый DataFilter в Itemscontrol.

[Текущее решение] У меня есть специальный элемент управления comcombo, который происходит из combobox [в основном кнопка + combobox]. Специальная комбо прекрасно работает, когда умышленно связана. Поэтому я уверен, что проблема не в специальной комбо. Когда я устанавливаю свойство ItemsControl.ItemsSource в коллекцию DataFilters и создаю DataTemplate из SpecialCombo, combobox не показывает никакого результата (Special combo не будет показывать кнопку переключения, если не будет указана кнопка «Только элементы»). Альтернативный подход (2) к привязке ниже, дайте мне увидеть раскрывающийся список, но раскрывающийся список пуст, но я знаю, что этого не должно быть.

здесь sumarized экстракты кода

public class DataModel :INotifyPropertyChanged 
{ 
    //The Item!! 
    public int Index {//Normal get set property} 
    public string Name {//Normal get set property} 
    public int Parent {//Normal get set property} 
    public string FullName {//Normal get set property} 
    public string DisplayName {//Normal get set property} 
    public bool Static {//Normal get set property} 
} 

public class DataFilters : DataCollection 
{ 
    public ObservableCollection<DataModel> CombinedData; 
    public int FilterIndex{//Property... The index of the current item like Index for DataModel.} 
    public string ParentName {//property ButtonContent item} 
    public int SelectedItem {//Property} 
} 

//Used as part of DataVieModel. Also responsible of building each DataFilters item and some other functions 
public class DataFilterGroup : INotifyPropertyChanged 
{ 
    public ObservableCollection<DataFilters> FullCollection; 
} 

Объект WPF за

<ItemsControl x:Name="PART_ListBox" HorizontalAlignment="Left" VerticalContentAlignment="Stretch" Margin="0"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel Orientation="Horizontal"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 

Код для WPF на нагрузке

//DVM = DataVieModel with some other objects. Filters = DataFilterGroup 
PART_ListBox.ItemsSource = DVM.Filters.FullCollection; 
PART_ListBox.ItemTemplate = DataFilterTemplate; 

//And DataTemplate (1) - shows no combobox 
private static DataTemplate DataFilterTemplate 
{ 
    get 
    { 
     DataTemplate DFT = new DataTemplate(); 
     DFT.DataType = typeof(DataFilters); 

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

     FrameworkElementFactory Item = new FrameworkElementFactory(typeof(SpecialCombo)); 
     Item.SetValue(SpecialCombo.ButtonContentProperty, new Binding("ParentName")); 
     Item.SetValue(SpecialCombo.ItemsSourceProperty, "CombinedData"); 
     Item.SetValue(SpecialCombo.DisplayMemberPathProperty, "DisplayName"); 
     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 = Stack; 

     return DFT; 
    } 
}  

//And DataTemplate (2) - shows combobox with no items in dropdown 
private static DataTemplate DataFilterTemplate 
{ 
    get 
    { 
     DataTemplate DFT = new DataTemplate(); 
     DFT.DataType = typeof(DataFilters); 

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

     FrameworkElementFactory Item = new FrameworkElementFactory(typeof(SpecialCombo)); 
     Item.SetValue(SpecialCombo.ButtonContentProperty, new Binding("ParentName")); 
     Item.SetValue(SpecialCombo.ItemsSourceProperty, new Binding("CombinedData")); 
     Item.SetValue(SpecialCombo.DisplayMemberPathProperty, "DisplayName"); 
     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 = Stack; 

     return DFT; 
    } 
}  
+0

Я серьезно не думал, что этот вопрос был настолько сложным, но кажется, что никто не может ответить на него :( – DaClan

ответ

0

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

DataFilters должен стать DependencyObject поэтому

public class DataFilters : DataCollection 
// should become 
public class DataFilters : DependencyObject 

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

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

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

Затем в DataTemplate файл следующее следует изменить Item.SetValue (SpecialCombo.ItemsSourceProperty, "CombinedData"); // Должен измениться на Item.SetBinding (SpecialCombo.ItemsSourceProperty, новое связывание («CombinedData»));

Я не прошел весь код выше, но я думаю, что все перечисленные изменения должны быть необходимы, чтобы связать элемент типа combobox в DataTemplate.

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