Donc comme dit plus haut, j'ai essayé et ça fonctionne!
Comme un peiti exemple vaut mieux qu'un long discour, j'ai fait une petite application qui explique ce que je voulais faire...
Le xaml d'abord
<Window x:Class="BindingTest.MainWindow"
xmlns="[http://schemas.microsoft.com/winfx/2006/xaml/presentation]"
xmlns:x="[http://schemas.microsoft.com/winfx/2006/xaml]"
Title="MainWindow" Height="400" Width="320" Loaded="Window_Loaded">
<Grid>
<ListBox HorizontalAlignment="Stretch" Margin="0,50,0,0" Name="MaListBox" VerticalAlignment="Stretch" Grid.ColumnSpan="2" PreviewMouseDown="MaListBox_PreviewMouseDown" >
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Image Height="15" HorizontalAlignment="Left" Margin="0" Source="{Binding Img}" VerticalAlignment="Center" Width="50" />
<Label Content="{Binding NomItem}" HorizontalAlignment="Stretch" Margin="60,0,0,0" VerticalAlignment="Top" />
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Button Content="Item suivant" HorizontalAlignment="Center" Margin="0,20,120,0" Name="nextButton" VerticalAlignment="Top" Width="100" Height="20" Click="nextButton_Click"/>
<Button Content="Item précédent" HorizontalAlignment="Center" Margin="120,20,0,0" Name="previousButton" VerticalAlignment="Top" Width="100" Height="20" Click="previousButton_Click"/>
</Grid>
</Window>
Ensuite la classe:
using System.ComponentModel;
namespace BindingTest
{
class TestPropertyChanged : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged; //Evènement qui va faire en sorte que les changements d'image seront pris en compte
//Les propriétés
public string NomItem { get; set; }
private string _Img;
public string Img
{
get
{
return _Img;
}
set
{
_Img = value;
MyPropertyChanged("Img"); //la propriété de ma classe que le "binding" influencera
}
}
//constructeur
public TestPropertyChanged(string nItem, string itemSelection)
{
NomItem = nItem;
_Img = itemSelection;
}
//méthode qui est applée en cas de changement de la propriété
protected void MyPropertyChanged(string propertyName)
{
if (PropertyChanged == null)
{
return;
}
else
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}
Et enfin le corps du programme:
using System.Collections.Generic;
using System.Windows;
using System.Windows.Input;
namespace BindingTest
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
//chemin complet de l'image
const string sourceImage = @"C:\Users\Thomas\Desktop\BindingTest\BindingTest\Images\fleche_droite.png";
List<TestPropertyChanged> liste; //la liste... rien à ajouter!
int index; //numéro de l'item dans la liste
private void Window_Loaded(object sender, RoutedEventArgs e)
{
index = 0;
liste = new List<TestPropertyChanged>();
liste.Add(new TestPropertyChanged("Item 01", sourceImage)); //La logique veut commencer à sélectionner les item par le début donc chemin de l'image symbolisant la selection!
liste.Add(new TestPropertyChanged("Item 02", null)); //Ensuite, null (ce qui n'affichera pas l'image!!!).
liste.Add(new TestPropertyChanged("Item 03", null));
liste.Add(new TestPropertyChanged("Item 04", null));
liste.Add(new TestPropertyChanged("Item 05", null));
liste.Add(new TestPropertyChanged("Item 06", null));
liste.Add(new TestPropertyChanged("Item 07", null));
liste.Add(new TestPropertyChanged("Item 08", null));
liste.Add(new TestPropertyChanged("Item 09", null));
liste.Add(new TestPropertyChanged("Item 10", null));
MaListBox.ItemsSource = liste;
}
private void nextButton_Click(object sender, RoutedEventArgs e)
{
liste[index].Img = null; //on chage d'item, donc plus besoin d'afficher l'image
index = (index < MaListBox.Items.Count - 1) ? index + 1 : 0; //on incrémente l'indice servant à choisir les item dans la liste (si on arrive au bout de la liste, on revien au début)
liste[index].Img = sourceImage; //affichage de l'image à l'indice suivant
}
private void previousButton_Click(object sender, RoutedEventArgs e)
{
//même principe que pour "nextButton_Click"
liste[index].Img = null;
index = (index == 0) ? MaListBox.Items.Count - 1 : index - 1;
liste[index].Img = sourceImage;
}
private void MaListBox_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
//Come je veux symboliser la sélection à ma manière, j'annule l'évènement natif de la listBox
e.Handled = true;
}
}
}
EDIT: Précision du langage dans la coloration syntaxique.