[WPF] DataTemplate et ObjectDataProvider

CMatt Messages postés 38 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 15 octobre 2010 - 14 oct. 2010 à 15:55
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 - 15 oct. 2010 à 14:12
Bonjour à tous,

malgré de multiples recherches et essais, je ne parviens pas à utiliser un ObjectDataProvider dans un DataTemplate.

Le but de la manoeuvre est d'afficher le résultat d'une méthode d'un élément d'une liste directement dans un ListBox.

Ma classe objet :
using System;
using System.Windows;

namespace MyNS
{
  public class MyObject
  {
    public string Text { get; set; }
    public double X { get; set; }
    public double Y { get; set; }
    public override string ToString() { return string.Concat( this.Text, " (", this.X.ToString(), ";", this.Y.ToString(), ")" ); }
    public Point ToPoint() { return new Point( this.X, this.Y ); }
  }
}


mon code XAML :
<Window
  x:Class="MyNS.MyWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:MyNS="clr-namespace:MyNS;assembly=Wpf"
  xmlns:System="clr-namespace:System;assembly=mscorlib"
  xmlns:Windows="clr-namespace:System.Windows;assembly=WindowsBase"
  Title="MyWindow" Height="500" Width="500">
  <Grid>
    <ListBox
      ItemsSource="{StaticResource objects}">
      <ListBox.ItemTemplate>
        <DataTemplate
          DataType="MyNS:MyObject">
          <TextBlock
            HorizontalAlignment="Center"
            VerticalAlignment="Center">
            <TextBlock.Text>
              
                
                  <ObjectDataProvider MethodName="ToPoint" />
                
              
            </TextBlock.Text>
          </TextBlock>
        </DataTemplate>
      </ListBox.ItemTemplate>
    </ListBox>
  </Grid>
</Window>


et mon code behind :
namespace MyNS
{
  public partial class MyWindow : Window
  {
    public MyWindow()
    {
      List<MyObject> objects = new List<MyObject>();
      objects.Add( new MyObject { Text "Objet 1", X 0, Y = 0 } );
      objects.Add( new MyObject { Text "Objet 2", X 1, Y = 0 } );
      objects.Add( new MyObject { Text "Objet 3", X 0, Y = 1 } );
      objects.Add( new MyObject { Text "Objet 4", X -1, Y = 0 } );
      objects.Add( new MyObject { Text "Objet 5", X 0, Y = -1 } );
      objects.Add( new MyObject { Text "Objet 5", X 2, Y = 0 } );

      Resources.Add( "objects", objects );
      InitializeComponent();
    }
  }
}


Rien de compliqué il me semble.

Dans ces conditions, je n'ai rien à l'affichage (pas d'appel à une méthode ToPoint(), et donc pas d'appel à Point.ToString() pour l'affichage).

En revanche, si j'enlève l'ObjectDataProvider de mon DataTemplate, j'ai bien le résultat d'un appel à la méthode ToString() de mon objet.

Quelqu'un peut-il me dire ce que je fais de travers?

Merci à vous.

5 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 36
14 oct. 2010 à 20:07
Salut,

Il me semble qu'il ne faut pas utiliser l'objectdatasource pour effectuer ce type d'operation.

Il est préférable d'utiliser une propriété virtuel en lecture seule pour affiché le texte voulu et la mise en place est tres facile.

Alors pour comprendre a l'obectdatasource regardes le lien
http://morpheus.developpez.com/wpf/objectdataprovider/ObjectDataProviderWPF.pdf
Fullname est une propiete en lecture seule dans l'exemple du lien.

Bon dev
0
CMatt Messages postés 38 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 15 octobre 2010
15 oct. 2010 à 11:44
Salut et merci pour ta réponse.

Néanmoins, permet moi d'être un peu têtu. Le document n'évoque aucune solution quant à l'appel d'une méthode dans un DataTemplate (en l'occurence, aucun exemple d'appel sur une méthode déclarée par la classe Customer elle même n'est présent).

Oublions mon exemple et considérons le cas où il est nécessaire de passer des paramètres à une méthode d'un objet listé, et d'afficher le résultat de cet appel.

Comment faire?

Merci.
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 36
15 oct. 2010 à 11:59
J'ai pas compris le but.

Peut etre ce que tu cherches est l'utilisation de converter et multi value converter.

Qui a partir d'une liste de parametres te sorte un objet par exemple.

Renseignes-toi sur le web.

(La solution de propriété en lecture seule te plais pas????)
0
CMatt Messages postés 38 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 15 octobre 2010
15 oct. 2010 à 13:40
Merci pour le temps que tu accordes à mon problème.

Prenons un autre exemple :

List<string> strings = new List<string>();
strings.Add( "Une..." );
strings.Add( "Chaine..." );
strings.Add( "De..." );
strings.Add( "Caractères..." );

Resources.Add( "strings", strings );


<ListBox ItemsSource="{StaticResource strings}">
  <ListBox.ItemTemplate>
    <DataTemplate DataType="System:String">
      <StackPanel Orientation="Horizontal">
        <TextBlock HorizontalAlignment="Center" Text="&quot;" />
        <TextBlock HorizontalAlignment="Center" Text="{Binding}" />
        <TextBlock HorizontalAlignment="Center" Text="&quot; ; l'indice du premier point est " />
        <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center">
          <TextBlock.Text>
            
              
                <ObjectDataProvider MethodName="IndexOf">
                  <ObjectDataProvider.MethodParameters>
                    <System:Char>.</System:Char>
                  </ObjectDataProvider.MethodParameters>
                </ObjectDataProvider>
              
            
          </TextBlock.Text>
        </TextBlock>
      </StackPanel>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>


Effectivement, l'utilisation d'un convertisseur solutionnerait le problème, mais une telle solution me parait bien lourde pour un cas aussi simple.

N'y a-t-il donc aucune solution XAML pur?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 36
15 oct. 2010 à 14:12
Non pas de methode XAML pure à ma connaissance.

Une propriété devrait répondre à ta solution aussi.

public string premierPoint {get{return chaine.IndefOf('.'c);)}
0
Rejoignez-nous