项目从ItemsControl绑定到ItemsSource之外的值?

时间:2012-11-12 08:08:43

标签: c# wpf xaml

我有一个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>

如何正确绑定公司?

3 个答案:

答案 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; }
}