WPF数据上下文c#

本文关键字:上下文 数据 WPF | 更新日期: 2023-09-27 18:07:33

我试图理解数据上下文是如何传递给usercontrols的。

我有两个类:

    public class OuterClass
    {
            public InnerClass inner {get; set;}
    }
    public class InnerClass
    {
            public void targetFun()
            {
                    //do something
            }
    }

和Main Window类

    public class MainWindow: Window
    {
            public OuterClass outer {get; set;}
            //...
    }

在主窗口xaml文件中,DataContext被设置为Outer类

    <Window <!-- Properties --> >
            <Grid DataContext="{Binding outer}">
                    <MyControl DataContext="{Binding inner}">
                    <!-- Here I do more stuff from outer class -->
            </Grid>
    </Window>

这是UserControl的定义

    <UserControl x:Class="my:MyControl">
            <Grid>
                    <TextBlock MouseDown="targetFun">Click me!</TextBlock>
            </Grid>
    </UserControl>

当我尝试编译时,我得到的错误是函数"targetFun"不存在于'MyControl'中,这意味着编译器没有意识到我试图在内部设置上下文。我该怎么做呢?

抱歉,我不能展示真实的代码,但这就是我所做的。谢谢!

编辑:错误

WPF数据上下文c#

在WPF中,Binding使用控件的DataContext作为其上下文。例如,

<Grid DataContext="{Binding outer}">
    <local:MyControl DataContext="{Binding inner}">

innerouter值的成员。这个例子有点滑稽,因为在计算{Binding inner}(或其他)的时候,GridDataContext是从它的父节点继承的outer。但是绑定会把它设为别的东西。我避免这样的事情;我相信你说的,它确实有效。

MouseDown的绑定在哪里?

<TextBlock MouseDown="targetFun">Click me!</TextBlock>

。这不是您绑定视图模型属性的常规属性,因此TextBlockDataContext是无关紧要的。这是一个事件,并且正在(或应该)给它一个事件处理程序。事件是不同的(因为它们是不同的,这就是原因)。因为没有{Binding ...},它不寻找DataContext的属性;它在代码隐藏类上寻找事件处理程序方法。删除那里的="targetFun",在MouseDown之后输入=",它将提示您在代码隐藏类上创建事件处理程序。

您可以在事件处理程序中像这样调用targetFun():

private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e)
{
    ((sender as FrameworkElement).DataContext as InnerClass)?.targetFun();
}