如何从wpf中的高级数据上下文中获取数据上下文
本文关键字:上下文 数据 获取 高级 wpf | 更新日期: 2023-09-27 18:22:14
我有A类和B:
public class A : INotifyPropertyChanged
{
private string _ina;
public string InA
{
get
{
return _ina;
}
set
{
_ina = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("InA"));
}
}
}
public A()
{
InA = "INA";
}
public event PropertyChangedEventHandler PropertyChanged;
}
public class B : INotifyPropertyChanged
{
private string _inb;
public string INB
{
get
{
return _inb;
}
set
{
_inb = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("INB"));
}
}
}
public B()
{
INB = "B_inb";
}
public event PropertyChangedEventHandler PropertyChanged;
}
和xaml(local是a类和B类所在的命名空间别名):
<Grid>
<Grid.DataContext>
<local:B/>
</Grid.DataContext>
<StackPanel>
<StackPanel.DataContext>
<local:A/>
</StackPanel.DataContext>
<TextBlock Text="{Binding Path=InA}"/>
<TextBlock Text="{Binding Path=INB }"/>
</StackPanel>
</Grid>
我知道第一个TextBlock
会得到正确的值,但第二个不能。但是,我如何获得DataContext
,使第二个TextBlock
从网格的DataContext
中获得正确的值,而不是从堆栈面板的DataContext
中获得正确值?
正如你自己正确理解的那样,
<TextBlock Text="{Binding Path=DataContext.INB,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}}}"/>
将起作用。它所做的是向上遍历可视化树,直到找到类型为Grid
的祖先,然后在该祖先中查找名为DataContext.INB
的属性。在这种情况下,网格的数据上下文将是类B,INB是其中定义的属性。