可以从ItemsControl的datatemplate绑定组合框Itemssource

时间:2013-07-09 18:21:24

标签: c# wpf combobox observablecollection itemscontrol

鉴于ComboBox中的ItemsControl会有不同的项目,这些项目基于项目的DataContext(不是ItemsControl)。可以吗?如何?最好是代码背后。

我有以下DataModel

class Tester
{
    public Tester(string name, string surname)
    {
        Name = name;
        Surname = surname;
    }

    public string Name { get; set; }
    public string Surname { get; set; }
    public override string ToString()
    {
        return Name + " " + Surname;
    }
}

class TheT
{
    public ObservableCollection<Tester> TesterObject;

    public TheT()
    {
        TesterObject = new ObservableCollection<Tester>();
    }

    public string myDisplayName { get { return "test"; } }

    public void Add(Collection<Tester> col)
    {
        TesterObject.Clear();
        foreach (Tester t in col) { TesterObject.Add(t); }
    }
}

Window代码中我有:

ObservableCollection<TheT> myDataV ;
Public MainWindow()
{
    InitializeComponent();

    ObservableCollection<Tester> Tester1 = new ObservableCollection<Tester>();
    Tester1.Add(new Tester("Sunny", "Jenkins"));
    Tester1.Add(new Tester("Pieter", "Pan"));

    ObservableCollection<Tester> Tester2 = new ObservableCollection<Tester>();
    Tester2.Add(new Tester("Jack", "Sanders"));
    Tester2.Add(new Tester("Bill", "Trump"));

    myDataV = new ObservableCollection<TheT>();
    myDataV.Add(new TheT(Tester1));
    myDataV.Add(new TheT(Tester2));

    IControl.ItemsSource = myDataV;
    IControl.ItemTemplate = TestingDT;
}

IControlItemsControl中设置的XAML

<ItemsControl x:Name="IControl" Margin="53,375,81,63">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

DataTemplate我尝试过各种方式。但仍然没有得到如下所示的项目:

// the DataTemplate
private DataTemplate TestingDT
{
    get
    {
        DataTemplate DFT = new DataTemplate();
        DFT.DataType = typeof(TheT);

        FrameworkElementFactory Item = new FrameworkElementFactory(typeof(ComboBox));

        Binding B = new Binding("TesterObject")
        {
            Source = this
        };

        Item.SetBinding(ComboBox.ItemsSourceProperty, B);
        //Item.SetValue(ComboBox.DisplayMemberPathProperty, "Name");

        DFT.VisualTree = Item;
        return DFT;
    }
}

1 个答案:

答案 0 :(得分:1)

通过这些小改动你应该得到预期的结果

public class Tester {
  public Tester(string name, string surname) {
    Name = name;
    Surname = surname;
  }

  public string Name { get; set; }

  public string Surname { get; set; }

  public override string ToString() {
    return Name + " " + Surname;
  }
}

public class TheT : DependencyObject {
  public static readonly DependencyProperty TesterObjectProperty =
    DependencyProperty.Register("TesterObject", typeof(ObservableCollection<Tester>), typeof(TheT),
                                new FrameworkPropertyMetadata());

  public ObservableCollection<Tester> TesterObject {
    get { return (ObservableCollection<Tester>)GetValue(TesterObjectProperty); }
    set { SetValue(TesterObjectProperty, value); }
  }

  public TheT(Collection<Tester> col) {
    TesterObject = new ObservableCollection<Tester>();
    foreach (Tester t in col) { TesterObject.Add(t); }
  }

  public void Add(Collection<Tester> col) {
    TesterObject.Clear();
    foreach (Tester t in col) { TesterObject.Add(t); }
  }
}

public Window1()
{
  InitializeComponent();

  ObservableCollection<Tester> Tester1 = new ObservableCollection<Tester>();
  Tester1.Add(new Tester("Sunny", "Jenkins"));
  Tester1.Add(new Tester("Pieter", "Pan"));

  ObservableCollection<Tester> Tester2 = new ObservableCollection<Tester>();
  Tester2.Add(new Tester("Jack", "Sanders"));
  Tester2.Add(new Tester("Bill", "Trump"));

  var myDataV = new ObservableCollection<TheT>();
  myDataV.Add(new TheT(Tester1));
  myDataV.Add(new TheT(Tester2));

  IControl.ItemsSource = myDataV;
}

XAML

<Window x:Class="stackoverflow.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:stackoverflow"
        Title="stackoverflow"
        Height="300"
        Width="300">

  <Grid>

    <ItemsControl x:Name="IControl" Margin="10">
      <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
          <VirtualizingStackPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
      </ItemsControl.ItemsPanel>
      <ItemsControl.ItemTemplate>
        <DataTemplate DataType="{x:Type local:TheT}">
          <ComboBox ItemsSource="{Binding TesterObject}"
                    MinWidth="80"
                    DisplayMemberPath="Name" />
        </DataTemplate>
      </ItemsControl.ItemTemplate>
    </ItemsControl>

  </Grid>

</Window>

希望有所帮助