1

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

如何正确绑定公司?

4

3 回答 3

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>

谢谢, 拉吉尼坎特

于 2012-11-12T11:11:16.080 回答
0

您定义的每个 DataTemplate 都使用 ItemsControl.ItemsSource 中的一个对象作为 DataContext。在您的情况下,它是一个人类。

因此,在 DataTemplate 中,它正在寻找 Contents Name 和 Company 属性。在本例中,Person.Name、Person.Company。

如果要查找公司,可以在人员类中添加公司属性,或设置绑定路径以查找公司属性。后者取决于您相对于 itemsSource 定义公司属性的位置

于 2012-11-12T08:32:56.500 回答
0

创建一个包含 Name 和 Company 的类,使用新创建类型的对象组成列表并将其设置为 itemssource。

internal class Worker 
{
    public string Name { get; set; }
    public string Company { get; set; }
}
于 2012-11-12T08:58:37.627 回答