2013-07-09 4 views
1

Je suis en train de trouver une solution à cette question que je posais plus tôt: Populate SourceList in Xamarin.Mac appCréer NSView programatically dans Xamarin studio

J'essaie actuellement de mettre en œuvre la méthode GetView du NSOutlineViewDelegate pour voir si cela peut créer un texte dans la OutlineView J'ai.

Mais je suis bloqué à essayer d'ajouter des choses à l'objet NSView. Quand je regarde l'exemple OutlineView (celui que vous obtenez par défaut lorsque vous le faites glisser sur votre fenêtre), il y a un TableCellView pour chaque élément. La structure ressemble à ceci (en-tête d'abord, puis point régulier):

Table Cell View 
    Static Text - HEADER CELL 
    Text Field Cell - HEADER CELL 

Table Cell View 
    Image View 
    Image Cell 
    Static Text - Table View Cell 
    Text Field Cell - Table View Cell 

Jusqu'à présent, ma méthode ressemble à ceci:

public override NSView GetView (NSOutlineView outlineView, NSTableColumn tableColumn, NSObject item) 
{ 
    var navigation = item as Navigation; 
    var cell = new NSTableCellView(); 

    if (navigation.IsHeader) { 
    } else { 
    } 

    return cell; 
} 

Ma première deviner ce que l'en-tête, par exemple, je crée NSTableHeaderCell et définissez la propriété StringValue sur navigation.Name. Mais je ne sais pas comment l'ajouter comme un enfant à mon NSTableViewCell. Ou est-ce que je vais à ce sujet tout à fait faux? Je suis très nouveau sur Mono et Xamarin (je n'ai fait que C# et Visual Studio en utilisant WPF et XAML) et je n'avais encore jamais programmé en Objective-C auparavant (il m'a donc fallu du temps pour comprendre la syntaxe bizarre des méthodes/classes).

Répondre

2

Vous verrez dans XCode que les objets Table Cell View ont un 'Identificateur' que vous pouvez définir. Dans mon cas, j'ai 'HeaderCell' et 'DataCell'.

Mon code ressemble à ceci:

public override NSView GetView(NSOutlineView outlineView, NSTableColumn tableColumn, NSObject item) 
{ 
    if(IsGroupItem(outlineView, item)) 
    { 
     return outlineView.MakeView("HeaderCell", this); 
    } 

    return outlineView.MakeView("DataCell", this); 
} 

Cela va créer une instance appropriée du TableCellView défini dans XCode.

Dans mon cas, j'utilise des liaisons Cocoa plutôt qu'une source de données, mes vues sont donc automatiquement remplies avec des données. Cela peut être une approche que vous souhaitez étudier car elle est beaucoup plus proche de la méthode de liaison de données WPF/XAML. Cependant, il a une courbe d'apprentissage abrupte et est difficile à déboguer (comme la liaison de données WPF/XAML!). Au lieu de simplement renvoyer la cellule, vous pouvez accéder à ses sous-vues et les configurer de manière appropriée. Quelque chose comme:

var dataView = outlineView.MakeView("DataCell", this); 
((NSImageView)dataView.Subviews[0]).Image = // assign an image 
((NSTextField)dataView.Subviews[1]).StringValue = // assign your text 
return dataView; 

(Note: Je viens tapés à partir du haut de ma tête, il peut ne pas fonctionner en l'état - mais nous espérons que vous avez l'idée)

+0

serait-ce ou d'une autre override pouvoir détecter quand l'utilisateur a édité la valeur de chaîne du champ de texte d'un article? – salgarcia

+0

@salgarcia Voir cette question de suivi: http://stackoverflow.com/questions/17889328/listen-to-events-from-programatically-created-nsview – TheNextman

Questions connexes