繁体   English   中英

使用ItemsControl的DataTemplate进行组合框绑定

[英]Combobox binding using DataTemplate of ItemsControl

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

  • 数据模型项

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

  • DataFilterGroup类内的ObservableCollection过滤器

  • DataFilterGroup是DataViewModel中的1个项目

因此,窗口的DataContext是DataViewModel。

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

这是我需要帮助的地方!

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

如何在DataFilter中绑定组合框,以便它的项源指向DataFilter。 因此,源将更改(或组合框的内容将随每个DataFilterGroup项目一起更改)。

如果这是一个重复的问题,我深表歉意。 我现在所掌握的是以下内容(并尝试了几种方法来绑定组合框,但没有任何项目出现。令人惊讶的是,出现了Buttoncontent。特殊的组合是从Combobox派生的控件,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;

多亏了punker 76在另一篇文章中对问题的结构进行了重组(这里-> 可以从ItemsControl的数据模板绑定combobox Itemssource ),所以必须完成以下工作。

(1)对象数据过滤器必须从[依赖对象的创建]更改

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

(2)观测资料的收集也应改变。 所以

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中进行数据绑定所要采取的所有主要步骤

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM