繁体   English   中英

如何从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时,可以像Name1一样直接绑定ItemsSource Persons中每个Person对象的Name属性。 但是,当我将DataTemplate设置为GridViewColumn以便例如像Name2中那样手动设置TextAlignMent时,不可能直接访问ItemsSource Persons中每个Person对象的Name属性。

如上代码所示,我通过使用TemplatedParent解决了此问题。 尽管此代码通常可以正常工作,并且可以达到我的目标,但是VisualStudio在Text =“ {Binding Name}”部分中以消息“无法解析符号”警告我。 有没有更简单,更合适的方法来实现这种数据绑定?

您只需绑定到Name属性

<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;
        ...

如果您可以正常使用,则“输出窗口”中的错误和警告只是误报

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM