C# 无法在usercontrol上显示绑定?
我无法在usercontrol上显示属性值。 我以以下方式设置datacontext:C# 无法在usercontrol上显示绑定?,c#,wpf,xaml,C#,Wpf,Xaml,我无法在usercontrol上显示属性值。 我以以下方式设置datacontext: public MainController cm; public static MainWindow AppWindow; public partial class MainWindow { public MainWindow() { InitializeComponent(); cm = new MainController(); Dat
public MainController cm;
public static MainWindow AppWindow;
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
cm = new MainController();
DataContext = cm;
AppWindow = this;
}
}
public partial class Club : UserControl
{
public Club ()
{
InitializeComponent();
DataContext = MainWindow.AppWindow.cm;
}
在MainController中,我使用了所有控制器的所有属性,如下所示:
public class MainController: MainControllerVM
{
private ClubController _clubController = new ClubController();
public ClubController ClubController
{
get { return _clubController ; }
}
}
<Window x:Class="Example.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Example"
Title="MainWindow" Height="350" Width="525">
<UniformGrid Rows="2" Columns="2">
<local:MyUserControlA/>
<local:MyUserControlB/>
<local:MyUserControlC/>
<local:MyUserControlD/>
</UniformGrid>
</Window>
现在,我已经将我的用户界面拆分为不同的控件,以拥有更多的xaml组织。我需要从所有用户控件访问cm的主datacontext,我尝试了以下方法:
public MainController cm;
public static MainWindow AppWindow;
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
cm = new MainController();
DataContext = cm;
AppWindow = this;
}
}
public partial class Club : UserControl
{
public Club ()
{
InitializeComponent();
DataContext = MainWindow.AppWindow.cm;
}
但我得到:
NullReferenceException
在AppWindow上。我的主要问题是无法在用户控件上可用的标签上显示属性值:
<Label Content="{Binding ClubController.Club.Name}" />
此绑定在主窗口中工作,但在usercontrol上不工作,为什么???假设您有这样一个窗口:
public class MainController: MainControllerVM
{
private ClubController _clubController = new ClubController();
public ClubController ClubController
{
get { return _clubController ; }
}
}
<Window x:Class="Example.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Example"
Title="MainWindow" Height="350" Width="525">
<UniformGrid Rows="2" Columns="2">
<local:MyUserControlA/>
<local:MyUserControlB/>
<local:MyUserControlC/>
<local:MyUserControlD/>
</UniformGrid>
</Window>
现在请记住,DataContext是一个可继承的依赖属性,即它向下流动。通常,依赖项属性在默认情况下是不可继承的,除非您显式地声明它
因此,在逻辑树的根上设置DataContext一次,窗口及其所有子级都将看到它。本例中的UniformGrid和自定义控件
是的,这意味着您可以直接绑定到用户控件的XAML中的视图模型:
<UserControl x:Class="Example.MyUserControlA"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<TextBlock Text="{Binding PropertyFromMainViewModel}"/>
</Grid>
</UserControl>
4.以这种方式绑定到主视图模型
<Window x:Class="Example.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Example"
Title="MainWindow" Height="350" Width="525">
<UniformGrid Rows="2" Columns="2">
<local:MyUserControlA MyDependencyProperty="{Binding MainViewModelProperty}"/>
<local:MyUserControlB/>
<local:MyUserControlC/>
<local:MyUserControlD/>
</UniformGrid>
</Window>
另一种方法是使用RelativeSource进行绑定,但这会破坏UserControl的封装性和可重用性
WPF有一个陡峭的学习曲线,我希望我的提示能有所帮助…不要这样设置UserControl的DataContext。它将继承其父级的DataContext。如果这不是您想要的,请在XAML中使用绑定。父母是什么?什么是MainWindow.AppWindow.sfVm?是否存在该NullReferenceException的堆栈跟踪?它是否会在代码中的任何特定行抛出?什么类是公共静态MainWindow AppWindow;宣布加入?看起来您是作为MainWindow的属性访问它的,但是没有在那里声明减速在类之外。您确定访问的属性是正确的吗?@EdPlunkett我需要使用相同的datacontext,对于sfVM,我更正了这个问题。。当我启动应用程序时,AppWindow上的空值返回Bradley的异常,MainWindow是主窗口class@Vandehusend不是根据你发布的代码。您在MainWindow之外声明了AppWindow字段。@Vandehusend此处的任何内容都不会返回异常。有东西丢了一个。你是说AppWindow在该构造函数中为null吗?当然是这样的:在主窗口的构造函数调用InitializeComponent创建自己的子对象(执行usercontrol构造函数)之后,您将此分配给主窗口的构造函数中的AppWindow。如果从第一原理来看这不明显,为什么不在构造函数中设置断点或跟踪来确定执行顺序?谢谢你的回答,我只是想检查另一个usercontrol是否显示:Content={Binding ClubController.Club.Name}是的,所以问题只是一个特定的控件,不知道为什么,我怀疑这里还有另一个漏洞。你能移动cm=新的主控制器吗;和AppWindow=这个;在初始化组件并说明差异之前?datacontext是正确的,我发现了问题,我打开了另一个问题,如果您有时间,请检查这里: