如何从 DataTemplate 访问 ListView 的 ItemsSource 中每个对象的 属性 路径

How to access a property path of each object in ItemsSource of a ListView from a DataTemplate

如何从 DataTemplate 访问 ListView 的 ItemsSource 中每个对象的 属性 路径? 我正在尝试

public class Person : INotifyPropertyChanged
{
    private string _name;
    public string Name
    {
        get {return _name;}
        set
        {
            _name = value;
            OnPropertyChanged();
        }
    }
}

public partial class MyControl : UserControl, INotifyPropertyChanged
{
    private ObservableCollection<Person> _persons;
    public ObservableCollection<Person> Persons
    {
        get {return _persons;}
        set
        {
            _persons = value;
            OnPropertyChanged();
        }
    }
}

<!-- MyControl.xaml.cs -->
<Grid DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}">
    <ListView ItemsSource="{Binding Persons}">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Name1" DisplayMemberBinding="{Binding Name}"/>
                <GridViewColumn Header="Name2">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DataContext}"
                                    Text="{Binding Name}" TextAlignMent="Center"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>
</Grid>

在MyControl.xaml.cs中,当我在 ListView 的 GridViewColumn 中使用 DisplayMemberBinding 时, ItemsSource Persons 中每个 Person 对象的 Name 属性 可以像 Name1 一样直接绑定。 但是,当我将 DataTemplate 设置为 GridViewColumn 以便手动设置 TextAlignMent 时,例如在 Name2 中, 无法直接访问 ItemsSource Persons.

中每个 Person 对象的 Name 属性

我通过使用上面代码中所示的 TemplatedParent 解决了这个问题。 虽然这段代码通常可以正常工作,而且我可以得到我想要的东西, VisualStudio 在 Text="{Binding Name}" 部分用消息 "Can't resolve the symbol" 警告我。 有没有更简单更合适的方式来实现这种DataBinding?

您只需绑定到名称 属性

<GridViewColumn.CellTemplate>
     <DataTemplate>
        <TextBlock Text="{Binding Name}" TextAlignment="Center"/>
     </DataTemplate>
</GridViewColumn.CellTemplate>

而且您不需要这样做:

 <Grid DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}">

整个树都可以访问 DataContext。

如果您不使用 MVVM,您可以在后面的代码中设置数据上下文:

 public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
        ...

如果你让它工作,输出中的错误和警告 Window 只是误报