我正在开发基于WPF / PRISM的应用程序。父视图(usercontrol)中包含许多区域,并且在这些区域中加载子视图(usercontrol)。当子视图加载时,我可以看到控制台中打印的绑定错误。即使绑定属性是子视图的viewmodel的一部分,绑定解析似乎首先查看父视图的视图模型并抛出此错误。该应用程序工作正常,我想知道我是否可以摆脱这些错误。
我已经设法在我写的一个简单的应用程序中重新创建它。
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'(Name ='')'。 BindingExpression:路径= SampleText; DataItem ='MainWindow'(Name =''); 目标元素是'TextBlock' (名称= '');目标属性是'文字' (输入'String')
即使按钮正确显示其中的“Sample”文本,也会在控制台中打印。如何在控制台中打印此消息,我的应用程序为每个加载的子视图打印25个以上的错误。
答案 0 :(得分:3)
您应该将两个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>
答案 1 :(得分:0)
您是否需要在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; }
}