如何将DataTemplate中的ComboBox ItemSource绑定到List?

时间:2014-11-19 17:57:48

标签: c# wpf xaml binding datatemplate

我是WPF,C#,XAML等的新手,但我正在学习。到目前为止,我无法将DataTemplate中的ComboBox ItemSource绑定到C#字符串列表。

这是我的C#代码:

public class Giraffe {
    ...
    public Zebra() {
        AnimalStuff.Add("Head");
        AnimalStuff.Add("Stripes");
        AnimalStuff.Add("Tail");
    }

    private List<string> _animalStuff= new List<string>();
    public List<string> AnimalStuff {
        get { return _animalStuff; }
        set {
            _animalStuff= value;
            OnPropertyChanged("AnimalStuff");
        }
    }

    #region OnPropertyChanged
    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string propertyName) {
        if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); }
    }
    #endregion
}

这是我的XAML代码:

...
<Page.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="AnimalTemplates.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Page.Resources>
...
<ComboBox ItemsSource="{Binding AnimalStuff}" />

那部分完美无缺。我得到一个带有所有AnimalStuff字符串下拉列表的组合框。

但是,我需要将该组合框放在DataTemplate中。我无法让绑定工作。这是DataTemplate文件:

...
<DataTemplate x:Key="AnimalTemplate">
    <Grid x:Name="GridAnimalTemplate" >
        ...
        <Label Content="Select Animal Part:" />

        <ComboBox ItemsSource="{Binding AnimalStuff}" />
    </Grid>
</DataTemplate>

我将其添加到XAML文件中:

<ListBox ItemTemplate="{DynamicResource AnimalTemplate}" />

在ListBox中,我会看到正确的标签和组合框。但是组合框只是空的,因为它找不到要绑定的AnimalStuff列表。我已经尝试将绑定RelativeSource设置为各种设置,但我似乎无法在C#代码中找到它。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

首先添加INotifyPropertyChanged的界面,让我们看看之后会发生什么。

如果不能正常工作,请同时阅读以下link

答案 1 :(得分:0)

根据您在列表中添加项目的时间与将列表设置为ItemsSource时的情况而定,ComboBox可能无法反映ItemsSource的更新。使用ObservableCollection代替List,看看是否能解决您的问题。

答案 2 :(得分:0)

金景让我走上正轨。

这是正确答案:在C#代码中,您需要创建一个新列表。

List<AnimalListboxItem>[ AnimalItems = new List<AnimalListboxItem>();
public class AnimalListboxItem{
    public string AnimalPartLabel { get; set; }
    public List<string> AnimalStuff{ get; set; }
}

然后使用该新列表作为列表框的项目来源:

AnimalItems = new List<AnimalListboxItem>();
<listbox name>.Items.Add(new AnimalListboxItem
    AnimalPartLabelBound = "Select Animal Part:",
    AnimalStuffBound = AnimalStuff);

然后你可以在XAML中进行绑定:

<DataTemplate x:Key="AnimalTemplate">
    <Grid x:Name="GridAnimalTemplate" >
    ...
        <Label Content="{Binding AnimalPartLabelBound}" />

        <ComboBox ItemsSource="{Binding AnimalStuffBound}" />
    </Grid>
</DataTemplate>

您可以在AnimalListboxItem类中添加任意数量的内容,包括数组,其他列表等。