2011-06-28 39 views
2

我正在开发基于WPF/PRISM的应用程序。父视图(usercontrol)中包含许多区域,子视图(用户控件)在这些区域中加载。当子视图被加载时,我可以看到在控制台中打印的绑定错误。尽管绑定属性是子视图视图模型的一部分,但绑定解析似乎首先查看父视图的视图模型并引发此错误。该应用程序工作正常,我想知道我是否可以摆脱这些错误。child usercontrols中的BindingExpression路径错误

我设法在我写的一个简单的应用程序中重新创建了这个。

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 Error: 39 : BindingExpression path error: 'SampleText' property not found on 'object' ''MainWindow' (Name='')'. BindingExpression:Path=SampleText; DataItem='MainWindow' (Name=''); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')

得到印在控制台即使按钮正确显示文本“样品“。如何从控制台中打印出此消息,我的应用程序为每个加载的子视图打印25个以上的错误。

回答

3

你应该两个的ViewModels大概分成两类。然后让父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> 
+0

家长不知道孩子被加载的所有棱镜区域的视图被注入。 – anivas

+0

在这种情况下,每个子视图都是独立的。创建视图的过程应该将ViewModel注入到子视图中。如果您使用Unity来解析视图和视图模型,您可以一步完成它。见http://www.wintellect.com/CS/blogs/sloscialo/archive/2011/05/19/yet-another-way-to-attach-viewmodels-to-views.aspx – SergioL

+0

太棒了!它的工作从来没有想到它与视图模型解决方案有关。谢谢。 – anivas

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; } 
} 
+0

这实际上模拟了我的应用程序会发生什么。 MainWindow作为我的父视图,带有自己的ViewModel,网格是具有自己视图模型的子视图。我无法将子视图模型分配给父项,反之亦然。 – anivas

+0

我不知道这是否与您与Prism一起使用的依赖注入容器有关。你在使用Unity还是其他的? – NickHeidke

+0

Unity容器。 – anivas

相关问题