[英]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.