如何从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中获得正确值?

如何从wpf中的高级数据上下文中获取数据上下文

正如你自己正确理解的那样,

<TextBlock Text="{Binding Path=DataContext.INB,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}}}"/>

将起作用。它所做的是向上遍历可视化树,直到找到类型为Grid的祖先,然后在该祖先中查找名为DataContext.INB的属性。在这种情况下,网格的数据上下文将是类B,INB是其中定义的属性。