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

时间:2011-06-28 18:12:18

标签: c# wpf data-binding

我正在开发基于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个以上的错误。

2 个答案:

答案 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; }
}