Bonjour,
J'ai un UserControl personnalisé dans lequel j'ai un Label et une ComboBox.
Sur l'évènement Loaded de l'UC, je charge une liste d'objet <T> et la défini comme ItemsSource de ma ComboBox.
Mon UserControl défini une DependencyProperty de type T
Ma fenêtre principal qui implémente l'UserControl possède une propriété de type T et j'aimerais faire un binding de cette propriété sur la DependencyProeprty de mon UserControl.
Je vous joins mon code :
XAML de l'UserControl :
Code Behind de l'UserControl :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 <UserControl x:Class="WpfApplication3.UserControls.UserControl1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" d:DesignHeight="29" d:DesignWidth="316" Loaded="UserControl_Loaded"> <Grid> <Label Content="{Binding Path=Code}" Height="30" HorizontalAlignment="Left" Name="label1" VerticalAlignment="Top" Width="72" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" /> <ComboBox Height="30" HorizontalAlignment="Left" Margin="78,0,0,0" Name="comboBox1" VerticalAlignment="Top" Width="158" DisplayMemberPath="Libelle" SelectedValuePath="Id" /> </Grid> </UserControl>
XAML de ma fenêtre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 public partial class UserControl1 : UserControl { private List<RegroupementViewModel> regroupements; public static readonly DependencyProperty RegroupementProperty = DependencyProperty.Register("Regroupement", typeof(RegroupementViewModel), typeof(UserControl1)); public RegroupementViewModel Regroupement { get { return (RegroupementViewModel)GetValue(RegroupementProperty); } set { SetValue(RegroupementProperty, value); } } public UserControl1() { InitializeComponent(); regroupements = new List<RegroupementViewModel>(); comboBox1.ItemsSource = regroupements; DataContext = Regroupement; } private void LoadRegroupements() { regroupements.Add(new RegroupementViewModel() { Id = 1, Code = "RG1", Libelle = "Regroupement1" }); regroupements.Add(new RegroupementViewModel() { Id = 2, Code = "RG2", Libelle = "Regroupement2" }); regroupements.Add(new RegroupementViewModel() { Id = 3, Code = "RG3", Libelle = "Regroupement3" }); } private void UserControl_Loaded(object sender, RoutedEventArgs e) { LoadRegroupements(); } private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e) { Regroupement = (RegroupementViewModel)comboBox1.SelectedItem; } }
Code Behind de ma fenêtre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 <Window x:Class="WpfApplication3.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:src="clr-namespace:WpfApplication3" Title="MainWindow" Height="350" Width="525" xmlns:my="clr-namespace:WpfApplication3.UserControls"> <Grid> <my:UserControl1 HorizontalAlignment="Left" Margin="134,138,0,0" x:Name="userControl11" VerticalAlignment="Top" /> </Grid> </Window>
Mon ViewModel :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 public partial class MainWindow : Window { RegroupementViewModel Regroupement; public MainWindow() { InitializeComponent(); DataContext = this; Regroupement = new RegroupementViewModel() { Id = 1, Code = "RG1", Libelle = "Regroupement1" }; } }
Ce que je voudrais faire, c'est faire en sorte que la propriété Regroupement de ma fenêtre soit mise à jours en fonction de la valeur de la dependencyproperty Regroupement de mon UC et que le Code affiché dans le label soit lié au code de la dependencyproperty.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 public class RegroupementViewModel : INotifyPropertyChanged { private string _Libelle; private string _Code; private int _Id; public string Libelle { get { return _Libelle; } set { _Libelle = value; OnPropertyChanged("Libelle"); } } public string Code { get { return _Code; } set { _Code = value; OnPropertyChanged("Code"); } } public int Id { get { return _Id; } set { _Id = value; OnPropertyChanged("Id"); } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string name) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(name)); } } }
J'ai un peu de mal à comprendre le fonctionnement de la liaison de donnée en WPF et je pense que résoudre ce petit problème m'en apprendrait beaucoup et en aiderait surement d'autre.
La sélection d'un élément dans ma combobox modifie bien la dependencyproperty, comment faire pour que le label soit mis à jour ? Et comment faire pour que la dependecyproperty change si je modifie le Regroupement de ma fenêtre et l'inverse ?
Merci d'avance.
Partager