Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法在usercontrol上显示绑定?_C#_Wpf_Xaml - Fatal编程技术网

C# 无法在usercontrol上显示绑定?

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

我无法在usercontrol上显示属性值。 我以以下方式设置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;
    }
在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是正确的,我发现了问题,我打开了另一个问题,如果您有时间,请检查这里: