子用户控件中存在BindingExpression路径错误
本文关键字:BindingExpression 路径 错误 存在 用户 控件 | 更新日期: 2023-09-27 18:00:32
我正在开发一个基于WPF/PRISM的应用程序。父视图(usercontrol)中有许多区域,子视图(usercontrol)加载在这些区域中。当加载子视图时,我可以看到控制台中打印的绑定错误。即使绑定属性是子视图视图模型的一部分,绑定解析似乎首先查看父视图的视图模型并抛出此错误。该应用程序运行良好,我想知道我是否可以消除这些错误。
我已经设法在我写的一个简单的应用程序中重新创建了这个。
C#
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
this.Loaded += (o, e) => { this.layout.DataContext = new ViewModel(); };
}
}
public class ViewModel
{
public ViewModel()
{
this.SampleText = "Sample";
}
public string SampleText { get; set; }
}
XAML
<Window x:Class="DataBindingResolution.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase"
Title="MainWindow" Height="350" Width="525">
<Grid x:Name="layout">
<Grid.Resources>
<TextBlock x:Key="test" Text="{Binding SampleText}"/>
</Grid.Resources>
<Button Content="{StaticResource test}"/>
</Grid>
</Window>
当你运行这个样本时,你可以看到:
System.Windows.Data错误:39:BindingExpression路径错误:在上找不到"SampleText"属性"object"MainWindow"(名称=")"。BindingExpression:Path=SampleText;DataItem='MainWindow'(名称='');目标元素为"TextBlock"(名称=");目标属性为"Text"(类型"字符串")
即使按钮在控制台中正确显示文本"Sample",也会在控制台中打印。如何从控制台中打印此消息,我的应用程序为加载的每个子视图打印25个以上的错误。
您可能应该将这两个ViewModel分为两个类。然后让父ViewModel引用子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>
是否需要在Loaded事件处理程序中设置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; }
}