我是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#代码中找到它。
有什么想法吗?
答案 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类中添加任意数量的内容,包括数组,其他列表等。