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中,Binding
使用控件的DataContext
作为其上下文。例如,
<Grid DataContext="{Binding outer}">
<local:MyControl DataContext="{Binding inner}">
inner
是outer
值的成员。这个例子有点滑稽,因为在计算{Binding inner}
(或其他)的时候,Grid
的DataContext
是从它的父节点继承的outer
。但是绑定会把它设为别的东西。我避免这样的事情;我相信你说的,它确实有效。
。MouseDown
的绑定在哪里?
<TextBlock MouseDown="targetFun">Click me!</TextBlock>
。这不是您绑定视图模型属性的常规属性,因此TextBlock
的DataContext
是无关紧要的。这是一个事件,并且正在(或应该)给它一个事件处理程序。事件是不同的(因为它们是不同的,这就是原因)。因为没有{Binding ...}
,它不寻找DataContext
的属性;它在代码隐藏类上寻找事件处理程序方法。删除那里的="targetFun"
,在MouseDown
之后输入="
,它将提示您在代码隐藏类上创建事件处理程序。
您可以在事件处理程序中像这样调用targetFun()
:
private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e)
{
((sender as FrameworkElement).DataContext as InnerClass)?.targetFun();
}