使用ItemsControl的DataTemplate绑定组合框

本文关键字:组合 绑定 DataTemplate ItemsControl 使用 | 更新日期: 2023-09-27 18:21:39

我已经搜索了一天半的解决方案。我得到的大多数解释/半解释情况的例子都与具有"静态"类型项目的组合框有关。我的结构如下。

  • 数据模型项

  • DataFilter类内的ObservableCollection CombinedData(即具有其他属性,包括"ParentName用于按钮内容")

  • DataFilterGroup类中的ObservableCollection筛选器

  • DataFilterGroup是DataViewModel 中的1项

所以窗口的DataContext是DataViewModel。

我有一个DataTemplate,我想在其中显示后面代码中的DataFilterGroup项

这是我需要帮助的地方!!

所以基本上:ItemsControl的Itemsource绑定到DataFilterGroup

如何在DataFilter中绑定一个组合框,使其项源指向DataFilter。因此,源将更改(或者组合框的内容将随每个DataFilterGroup项而更改)。

如果这是一个重复的问题,我深表歉意。到目前为止,我有以下内容(并尝试了几种方法来绑定组合框,但没有出现任何项目。不出所料,按钮内容出现了。特殊组合是组合框中的控件deriverd,它是一个按钮和组合框。

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.ItemsSource = DVM.Filters.FullCollection;
Child.ItemTemplate = DataFilterTemplate;

使用ItemsControl的DataTemplate绑定组合框

感谢punker 76在另一篇文章中,我重新构造了这个问题(这里->可以从ItemsControl的数据模板绑定一个组合框Itemssource吗),必须稍微完成以下操作。

(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 中对combobox类型对象进行数据绑定所需的主要步骤