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