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}">
inner
是 outer
值的成员。这个例子有点好笑,因为在计算 {Binding inner}
时(或其他),Grid
的 DataContext
是 outer
,继承自其父级。但是随后绑定将其设置为其他内容。我避免这样的事情;我相信你的话,它完全有效。
总之。 MouseDown
的绑定在哪里?
<TextBlock MouseDown="targetFun">Click me!</TextBlock>
无处可去。这不是您绑定视图模型 属性 的常规 属性,因此 TextBlock
的 DataContext
是无关紧要的。那是一个事件,并且正在(或应该)给它一个事件处理程序。事件是不同的(因为它们是不同的,这就是原因)。因为没有 {Binding ...}
,它不是在寻找 DataContext
的 属性;它正在代码隐藏 class 上寻找事件处理程序方法。在那里删除 ="targetFun"
,在 MouseDown
之后键入 ="
,它会提示您在代码隐藏 class 上创建一个事件处理程序。
您可以在事件处理程序中这样调用 targetFun()
:
private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e)
{
((sender as FrameworkElement).DataContext as InnerClass)?.targetFun();
}
我想了解如何将 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}">
inner
是 outer
值的成员。这个例子有点好笑,因为在计算 {Binding inner}
时(或其他),Grid
的 DataContext
是 outer
,继承自其父级。但是随后绑定将其设置为其他内容。我避免这样的事情;我相信你的话,它完全有效。
总之。 MouseDown
的绑定在哪里?
<TextBlock MouseDown="targetFun">Click me!</TextBlock>
无处可去。这不是您绑定视图模型 属性 的常规 属性,因此 TextBlock
的 DataContext
是无关紧要的。那是一个事件,并且正在(或应该)给它一个事件处理程序。事件是不同的(因为它们是不同的,这就是原因)。因为没有 {Binding ...}
,它不是在寻找 DataContext
的 属性;它正在代码隐藏 class 上寻找事件处理程序方法。在那里删除 ="targetFun"
,在 MouseDown
之后键入 ="
,它会提示您在代码隐藏 class 上创建一个事件处理程序。
您可以在事件处理程序中这样调用 targetFun()
:
private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e)
{
((sender as FrameworkElement).DataContext as InnerClass)?.targetFun();
}