我有一个ItemsControl,我有一个人员列表。人员列表中的每个元素都包含该人的姓名,而不包含任何其他内容。在c#代码中,我将testItemsControl.ItemsSource设置为包含每个人姓名的可观察集合。公司在代码隐藏中定义。以下xaml代码正确找到名称,但当然找不到公司。
<ItemsControl x:Name="testItemsControl">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="{Binding Company}"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
如何正确绑定公司?
答案 0 :(得分:1)
您必须使用RelativeSource绑定。
代码背后。
public partial class Window3 : Window
{
public Window3()
{
InitializeComponent();
this.DataContext = this;
BuildData();
Company = "XYZ";
testItemsControl.ItemsSource = Persons;
}
private void BuildData()
{
Persons.Add(new Person() { Name = "R1" });
Persons.Add(new Person() { Name = "R2" });
Persons.Add(new Person() { Name = "R3" });
}
public string Company { get; set; }
private ObservableCollection<Person> _persons = new ObservableCollection<Person>();
public ObservableCollection<Person> Persons
{
get { return _persons; }
set { _persons = value; }
}
}
XAML代码
<ItemsControl x:Name="testItemsControl">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" Margin="5"/>
<TextBlock Text="{Binding Company, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" Margin="5" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
谢谢, Rajnikant
答案 1 :(得分:0)
您定义的每个DataTemplate都使用ItemsControl.ItemsSource中的对象作为DataContext。在你的情况下,它是一个人类。
因此,在DataTemplate中,它正在寻找Contents Name和Company属性。在这种情况下,Person.Name,Person.Company。
如果要查找公司,可以将公司属性添加到人员类,或设置绑定路径以查找公司属性。后者取决于您相对于itemsSource定义公司属性的位置
答案 2 :(得分:0)
创建一个包含Name和Company的类,使用新创建的类型的对象组成列表,并将其设置为itemssource。
internal class Worker
{
public string Name { get; set; }
public string Company { get; set; }
}