在ContentControl崩溃中绑定

时间:2010-12-23 14:48:39

标签: wpf xaml binding contentcontrol

任何人都可以告诉我为什么这会导致我的应用崩溃吗?似乎有一些无休止的递归,我无法弄清楚为什么。我得到了这个例外

  

超出逻辑树深度   穿越树。这可以   表示树中的循环

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

3 个答案:

答案 0 :(得分:17)

您使用MainWindow作为MainWindow内容的DataContext。在ContentControl上设置Content="{Binding}"时,这会将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; }
}

答案 1 :(得分:0)

您应该删除ContentControl的Content属性上的绑定。无论如何,这应该做什么?

答案 2 :(得分:0)

虽然我完全同意你不应该接受的答案,但有时你却没有选择。例如,我正在使用Xceed PropertyGrid,而我对网格的每个项目的DataContext都是PropertyItem,它是UIElement(包含Value中的实际数据{1}}成员)。

我找到的解决方法是使用ContentPresenter而不是ContentControl。文档对此并不清楚,但似乎UIElement是模板而不是按原样使用。

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