2014-10-03 87 views
0

试图理解数据绑定,这完全看起来像是一个菜鸟的错误,但我不知道为什么会发生。InitializeComponent在绑定时触发StackOverflow异常

CS

namespace MuhProgram 
{ 
    public partial class MainWindow : Window 
    { 
     public string foobar 
     { 
      get { return "loremipsum"; } 
     } 

     public MainWindow() 
     { 
      InitializeComponent(); 
     } 
    } 
} 

XAML:在MainWindow()法StackOverflowException InitializeComponent()电话

<Window x:Class="MuhProgram.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:MuhProgram" 
     Title="MainWindow" Height="350" Width="525"> 

    <Window.Resources> 
     <local:MainWindow x:Key="classMainWindow"/> 
    </Window.Resources> 

    <Grid> 
     <Label Content="{Binding Source={StaticResource classMainWindow}, Path=foobar}"></Label> 
    </Grid> 
</Window> 

调试点。

我也尝试在网格中设置DataContext属性为"{StaticResource classMainWindow}",但效果是一样的。

回答

2

StackOverflow上引发异常,因为你是在递归此行

<local:MainWindow x:Key="classMainWindow"/> 

创建主窗口的实例时的InitializeComponent()被调用,则初始化XAML和编译BAML加载它。在加载它时发现Label内容需要MainWindow的另一个实例来绑定它的Content DP。因此,它会递归地创建MainWindow,直到它与SO异常崩溃。


您不需要声明MainWindow的另一个实例。绑定标签到父实例是这样的:

<Label Content="{Binding Path=foobar, RelativeSource={RelativeSource FindAncestor, 
                  AncestorType=Window}}"/> 

OR

要么设置的DataContext本身,让标签从父窗口继承它。

<Window DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
    .... 
    <Label Content="{Binding foobar}"/> 

OR

集合X:名称在窗口和使用的ElementName绑定。

<Window x:Name="myWindow"> 
    ..... 
    <Label Content="{Binding foobar, ElementName=myWindow}" /> 
+0

你是什么意思“声明MainWindow的另一个实例”?我在哪里做? – 2014-10-03 08:14:47

+1

这里你声明另一个实例''。 – 2014-10-03 08:15:23

+0

这就是为什么我得到堆栈溢出?这个人[这里](http://msdn.microsoft.com/en-us/library/ms752347(v = vs.110).aspx)正在做同样的事情(第一个XAML代码片段)。 – 2014-10-03 08:19:31