我已经搜索了一天半的解决方案。我得到的解释/半解释情况的大多数例子都与具有“静态”类型项目的组合框有关。我有以下结构。
DataModel项目
DataFilter类中的ObservableCollection CombinedData(即具有其他属性,包括“用于buttoncontent的ParentName”)
DataFilterGroup类中的ObservableCollection过滤器
DataFilterGroup是DataViewModel中的1项
所以窗口的DataContext是DataViewModel。
我有一个DataTemplate,我想从后面的代码中显示DataFilterGroup项目
这是我需要帮助的地方!
基本上:ItemsControl的Itemsource绑定到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;
}
}
Child是ItemsControl
Child.ItemsSource = DVM.Filters.FullCollection;
Child.ItemTemplate = DataFilterTemplate;
答案 0 :(得分:0)
感谢punker 76在另一篇文章中重新构建了问题(这里 - > Can one bind a combobox Itemssource from a datatemplate of a ItemsControl),我必须完成以下工作。
(1)对象数据过滤器必须从[创建依赖对象]
进行更改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)然后DataTemplate中的正确绑定变为
Item.SetBinding(SpecialCombo.ItemsSourceProperty, new Binding("CombinedData") );
这些是在DataTemplate中将组合框类型对象变为数据绑定的所有主要步骤