WPF 数据上下文 C#

WPF Data Context c#

我想了解如何将 datacontex 传递给用户控件。

我有 2 个 classes:

    public class OuterClass
    {
            public InnerClass inner {get; set;}
    }

    public class InnerClass
    {
            public void targetFun()
            {
                    //do something
            }
    }

和主要 Window class

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

            //...
    }

在主 window xaml 文件中,DataContext 设置为外部 class

    <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 中,Binding 使用控件的 DataContext 作为其上下文。例如,

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

innerouter 值的成员。这个例子有点好笑,因为在计算 {Binding inner} 时(或其他),GridDataContextouter,继承自其父级。但是随后绑定将其设置为其他内容。我避免这样的事情;我相信你的话,它完全有效。

总之。 MouseDown 的绑定在哪里?

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

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

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

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