13

谁能告诉我为什么这会使我的应用程序崩溃?我不知道为什么似乎有一些无休止的递归。我得到了这个例外

遍历树时超出逻辑树深度。这可能表明树中有一个循环

<ContentControl Content="{Binding}">
    <ContentControl.ContentTemplate>
        <DataTemplate>
            <Button Content="{Binding MyString}"/>
        </DataTemplate>
    </ContentControl.ContentTemplate>
</ContentControl>

这就是我作为来源的全部

    public MainWindow()
    {
        InitializeComponent();
        MyString = "Test";
        this.DataContext = this;
    }

    public string MyString { get; set; }
4

3 回答 3

19

您使用 MainWindow 作为 MainWindow 内容的 DataContext。当您Content="{Binding}"在 ContentControl 上进行设置时,这会将 ContentControl 的内容设置为 MainWindow 实例。这是一个问题,因为 ContentControl 包含在 MainWindow 的内容中。每当 Content 属性接收到 UIElement 时,它都会将其呈现为 UIElement,而不是像使用非 UI 类那样通过 DataTemplate。所以你的树最终成为

MainWindow
 ContentControl
  MainWindow
   ContentControl
    ...

为您的 DataContext 使用单独的数据对象而不是窗口本身将为您提供您正在寻找的行为:

public partial class Window13 : Window
{
    public Window13()
    {
        InitializeComponent();
        MyData data = new MyData();
        data.MyString = "Test";
        this.DataContext = data;
    }
}

public class MyData
{
    public string MyString { get; set; }
}
于 2010-12-23T19:21:33.147 回答
2

尽管我完全同意您不应该这样做的公认答案,但有时您别无选择。例如,我正在使用Xceed PropertyGrid并且DataContext我为网格的每个项目所拥有的是 aPropertyItem这是一个UIElement(包含Value成员中的实际数据)。

我发现的解决方法是使用 aContentPresenter而不是ContentControl. 文档对此尚不清楚,但似乎UIElement是模板化的,而不是按原样使用。

<ContentPresenter Content="{Binding}">
    <ContentPresenter.ContentTemplate>
        <DataTemplate>
            <Button Content="{Binding MyString}"/>
        </DataTemplate>
    </ContentPresenter.ContentTemplate>
</ContentPresenter>
于 2013-12-05T10:19:10.960 回答
0

您应该删除 ContentControl 的 Content 属性上的绑定。这到底应该做什么?

于 2010-12-23T15:05:39.020 回答