11
votes

Reliure dans ContentControl Crash

Quelqu'un peut-il me dire pourquoi cela bloque mon application? Il semble y avoir une récursion sans fin par je ne peux pas comprendre pourquoi. Je reçois cette exception

Profondeur d'arbre logique dépassé alors que traverser l'arbre. Cela pourrait indiquer un cycle dans l'arborescence xxx

et c'est tout ce que j'ai comme source xxx


0 commentaires

3 Réponses :


0
votes

Vous devez supprimer la liaison sur la propriété de contenu du contenuControl. Qu'est-ce que c'est censé faire quand même?


1 commentaires

Ma compréhension du contenuControl est que le DataContext de la base de données est le contenu du contenuControl et non du DataContext. Donc, si je l'enlève, je ne reçois pas de DataContext dans la catégorie DataTemplate pour lier du tout. Des idées?



18
votes

Vous utilisez Mainwindow comme DataContext du contenu de Mainwindow. Lorsque vous définissez content = "{Binding}" code> sur le contenuControl Ceci est en train de régler le contenu du contenuControl dans l'instance MainWindow. Ceci est un problème car le contenu contenus est contenu dans le contenu du MainWindow. Chaque fois qu'une propriété de contenu reçoit un uielement, il le rend comme un uielement, pas à travers le datatemplate car il serait avec une classe non-UI. Donc, votre arbre finit par être xxx pré>

à l'aide d'un objet de données distinct pour votre DataContext au lieu de la fenêtre elle-même vous donnera le comportement que vous recherchez: P>

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 commentaires

John, tu es l'homme !! Fonctionne comme un charme :) Je peux enfin mettre ce problème derrière moi et je connais aussi la raison grâce à votre explication très claire! Merci et joyeux Noël



1
votes

Bien que je suis totalement d'accord avec la réponse acceptée que vous ne devriez pas faire cela, parfois vous n'avez tout simplement pas le choix. Par exemple, j'utilise Xcee PapetmentGrid et le DataContext Code> J'ai pour chaque élément de la grille est un PropertyItem code> Un uielement code> (contenant les données réelles dans une valeur code> membre).

La solution que j'ai trouvée est d'utiliser un contentpresenter code> au lieu d'un contentcontrol code>. La documentation n'est pas claire à ce sujet, mais il semble que uielement code> soit amplifié au lieu d'être utilisé tel quel. P>

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


0 commentaires