任何人都可以告诉我为什么这会导致我的应用崩溃吗?似乎有一些无休止的递归,我无法弄清楚为什么。我得到了这个例外
超出逻辑树深度 穿越树。这可以 表示树中的循环
<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; }
答案 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>