Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.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# 子用户控件中的BindingExpression路径错误_C#_Wpf_Data Binding - Fatal编程技术网

C# 子用户控件中的BindingExpression路径错误

C# 子用户控件中的BindingExpression路径错误,c#,wpf,data-binding,C#,Wpf,Data Binding,我正在开发一个基于WPF/PRISM的应用程序。父视图(usercontrol)中有许多区域,子视图(usercontrol)加载在这些区域中。当加载子视图时,我可以看到控制台中打印的绑定错误。即使绑定属性是子视图的viewmodel的一部分,绑定解析似乎首先查看父视图的视图模型并抛出此错误。应用程序运行良好,我想知道是否可以消除这些错误 我已经设法在我编写的一个简单应用程序中重新创建了它 C# XAML 运行此示例时,您可以看到: System.Windows.Data错误:39: Bin

我正在开发一个基于WPF/PRISM的应用程序。父视图(usercontrol)中有许多区域,子视图(usercontrol)加载在这些区域中。当加载子视图时,我可以看到控制台中打印的绑定错误。即使绑定属性是子视图的viewmodel的一部分,绑定解析似乎首先查看父视图的视图模型并抛出此错误。应用程序运行良好,我想知道是否可以消除这些错误

我已经设法在我编写的一个简单应用程序中重新创建了它

C#

XAML


运行此示例时,您可以看到:

System.Windows.Data错误:39: BindingExpression路径错误: 在上找不到“SampleText”属性 “对象“””主窗口(名称=“”)”。 BindingExpression:Path=SampleText; DataItem='MainWindow'(名称=''); 目标元素是“TextBlock” (名称=“”);目标属性为“Text” (键入“字符串”)


在控制台中打印,即使按钮中正确显示文本“示例”。如何避免在控制台中打印此消息,我的应用程序为每个加载的子视图打印25+个错误。

是否需要在加载的事件处理程序中设置DataContext

我将代码移动了一点,并阻止了这些消息:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new ViewModel();
        //this.Loaded += (o, e) => { this.layout.DataContext = new ViewModel(); };
    }
}

public class ViewModel
{
    public ViewModel()
    {
        this.SampleText = "Sample";
    }
    public string SampleText { get; set; }
} 

您可能应该将这两个ViewModel分为两个类。然后让父视图模型引用子视图模型。其他一切都可以通过绑定来完成

public partial class MainWindow : Window     
{    
    public MainWindow()         
    {             
        InitializeComponent();             
        this.DataContext = new ParentViewModel();             
    }        
}  

public class ParentViewModel     
{
    public ViewModel()        
    { 
        this.Child = new ChildViewModel();       
    }         

    public ChildViewModel Child { get; set; }     
}  

public class ChildViewModel     
{
    public ViewModel()        
    { 
        this.SampleText = "Sample";         
    }         

    public string SampleText { get; set; }     
}
这个简化的Xaml需要:

<Window>     
 <Grid x:Name="layout" DataContext="{Binding Child}">
    <Button Content="{Binding SampleText}"/>
    </Grid> 
</Window>


这实际上模拟了我的应用程序中发生的情况。主窗口是具有自己视图模型的父视图,网格是具有自己视图模型的子视图。我无法将子视图模型分配给父视图模型,反之亦然。我想知道这是否与您与Prism一起使用的依赖项注入容器有关。您使用的是Unity还是其他?Bootstrapper与单个视图没有太多关联,它们在各自的模块中注册。你能告诉我你从哪里得到的吗?Parent不知道要加载的子视图都是注入视图的棱柱区域。在这种情况下,每个子视图都是独立的。创建视图的过程应将ViewModel注入子视图。如果使用Unity解析视图和视图模型,则可以一步完成这两项工作。太好了!它从未想过它与viewmodel分辨率有关。谢谢
public partial class MainWindow : Window     
{    
    public MainWindow()         
    {             
        InitializeComponent();             
        this.DataContext = new ParentViewModel();             
    }        
}  

public class ParentViewModel     
{
    public ViewModel()        
    { 
        this.Child = new ChildViewModel();       
    }         

    public ChildViewModel Child { get; set; }     
}  

public class ChildViewModel     
{
    public ViewModel()        
    { 
        this.SampleText = "Sample";         
    }         

    public string SampleText { get; set; }     
}
<Window>     
 <Grid x:Name="layout" DataContext="{Binding Child}">
    <Button Content="{Binding SampleText}"/>
    </Grid> 
</Window>