2014-06-18 2 views
0

Problème de liaison. Comment lier correctement les données à un contrôle utilisateur dans un autre contrôle utilisateur?WPF lier dynamiquement les données au contrôle utilisateur dans un autre contrôle utilisateur

J'ai donc un problème, pour moi un gros problème. Je fais un programme de programme dans WPF. Pour l'affiner, j'ai deux classes (Day et Shift) pour contenir mes données (simplifiées). La classe Day contient une liste de Shift. Une journée régulière peut contenir un nombre différent de quarts de travail, à savoir un de 9 à 14 et une autre de 18 à 22.

class Shift 
{ 
    public string StartTime { get; set; } 
} 
class Day 
{ 
    List<Shift> Shifts { get; set; } 
} 

J'ai deux contrôles utilisateur, un « DayControl » et un « ShiftControl »:

<UserControl x:Class="Spas.DayControl" ...> 
    <StackPanel x:Name="MyShifts"... /> 
</UserControl> 

<UserControl x:Class="Spas.ShiftControl" x:Name="uc"...> 
    <TextBox x:Name="tb_startTime" Text="{Binding StartTime, ElementName=uc, Mode=TwoWay}" /> 
</UserControl> 

En ShiftControl.xaml.cs:

public static DependencyProperty StartTimeProperty = DependencyProperty.Register("StartTime", typeof(string), typeof(ShiftControl), new PropertyMetadata("09:00", null, CoerceStartTimeValue)); 
public string StartTime 
{ 
    get { return (string)GetValue(StartTimeProperty); } 
    set { SetValue(StartTimeProperty, value); } 
} 

donc ce que je veux faire: Dans mon code principal je remplir ma journée avec un nombre dynamique de quarts de travail. C'est la partie facile. De là, je veux que mon DayControl crée dynamiquement autant de ShiftControls que de nombre de Shifts et les ajoute à la pile de ma DayControl. J'ai réussi à faire cela en utilisant le DataContextChanged de DayControl.

Code principal:

public Day MyDay { get; set; } 

private void CreateADay() 
{ 
    MyDay = new Day(); 
    MyDay.Shifts.Add(new Shift1() { StartTime = "09:00" }); 
    MyDay.Shifts.Add(new Shift1() { StartTime = "14:00" }); 
    dc1.DataContext = MyDay; // which is my DayControl in MainWindow 
} 

Et mon DayControl:

private void UserControl_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) 
{ 
    Day day = e.NewValue as Day; 
    foreach (var item in day.Shifts) 
    { 
     ShiftControl ctrl = new ShiftControl(); 
     // here I somehow want to bind item.StartTime to ctrl.StartTime 
     // This doesn't work: 
     // Binding binding = new Binding("ShiftControl.StartTimeProperty"); 
     // binding.Source = item.StartTime; 
     // binding.Mode = BindingMode.TwoWay; 
     // ctrl.SetBinding(ShiftControl.StartTimeProperty, binding); 

     _shifts.Children.Add(ctrl); 
    } 
} 

Mais en aucun cas je ne peux pas lier (twoway) mes données de passage à tb_startTime dans mon ShiftControl. J'ai lutté avec cela quelques jours maintenant et je pourrais juste être aveugle. Aider quelqu'un? Je peux mettre en place mon projet entier quelque part si nécessaire.

+0

S'il vous plaît modifier pour préciser comment cette question n'est pas utile que pour vous, sinon cette question ne fait pas partie sur ce site et devrait être supprimé. – franssu

Répondre

0

Si vous voulez lier dans le code derrière alors:

private void UserControl_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) 
{ 
    Day day = e.NewValue as Day; 
    foreach (var item in day.Shifts) 
    { 
     ShiftControl ctrl = new ShiftControl(); 
     // here I somehow want to bind item.StartTime to ctrl.StartTime 

     Binding myBinding = new Binding("StartTime"); 
     myBinding.Source = item; 
     ctrl.SetBinding(ShiftControl.StartTimeProperty, myBinding); 

     _shifts.Children.Add(ctrl); 
} 
} 
+0

Fonctionne comme un charme :) Thanx! – user3751677

+0

J'ai également ajouté binding.Mode = BindingMode.TwoWay; ... – user3751677

+0

bien sûr .. assurez-vous également que votre classe Shift et Day clas implémente INotifyPropertyChanged et vous augmentez les notifications de changement de propriété – Nitin

0

Exemple de méthode pour répondre à vos exigences. Vous devriez le concevoir comme ci-dessous. Assignez les objets de décalage en tant que itemsource à "DayControl" usercontrol itemsPanel. Ici, j'ai utilisé Itemspanel avec stackpanel comme ItemPanleTemplate.

<UserControl x:Class="Spas.DayControl" > 
    <ItemsControl x:Name="MyShifts" ItemsSource="{Binding ShiftObjects}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <local:Spas.ShiftControl /> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Vertical"/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
    </ItemsControl> 
</UserControl> 
Questions connexes