2010-06-08 9 views
1

J'ai un contrôle wpf nommé DataPicker qui a une propriété de dépendance nommée SelectedDate.La liaison ne fonctionne pas dans ListView

Dans les cas simples cela fonctionne bien mais il y a un cas où la liaison échoue et je ne peux pas comprendre pourquoi: quand j'essaye de le lier dans un ListView.

Par exemple, j'ai la classe (INotifyPropertyChanged est mis en œuvre)

public class TestClass : INotifyPropertyChanged 
{ 
    public string Name { get; set; } 
    public DateTime Date { get; set; } 
} 

et essayer de lier le prélèvement d'échantillons comme

public ObservableCollection<TestClass> Items { get; set; } 

qui a un élément en elle.

regards contraignants comme le

<Window x:Class="Neverov.Test.Window1" 
     x:Name="this" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:Neverov.Framework;assembly=Neverov.Framework"> 
    <Grid>   
     <ListView ItemsSource="{Binding ElementName=this, Path=Items}"> 
      <ListView.ItemTemplate> 
       <DataTemplate>      
        <StackPanel> 
         <TextBlock Text="{Binding Name}"/> 
          <local:DatePicker SelectedDate="{Binding Date, Mode=TwoWay}"/>        
        </StackPanel>      
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 
    </Grid> 
</Window> 

et propriété Name fonctionne très bien.

dans ma valeur de date DatePicker est présentée ainsi:

<TextBox x:Name="PART_TextBox"> 
    <TextBox.Text> 
     <Binding Path="SelectedDate" 
       RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type local:DatePicker}}" 
       Mode="TwoWay" 
       Converter="{StaticResource DateTimeConverter}" 
       ConverterParameter="d"> 
     </Binding> 
    </TextBox.Text>  
</TextBox> 

des idées pour lesquelles cela pourrait se produire?

Code Plus de la classe DatePicker: (certaines propriétés spécifiques que je dois, je vais plutôt manquer de garder la taille du code pas si grand)

[TemplatePart(Name = PartPopup, Type = typeof(Popup))] 
[TemplatePart(Name = PartMonthBack, Type = typeof(ButtonBase))] 
[TemplatePart(Name = PartMonthForward, Type = typeof(ButtonBase))] 
[TemplatePart(Name = PartDates, Type = typeof(Selector))] 
[TemplatePart(Name = PartTextBox, Type = typeof(TextBox))] 
[TemplatePart(Name = PartCheckBox, Type = typeof(CheckBox))] 
[TemplatePart(Name = PartToggleButton, Type = typeof(ToggleButton))] 
public class DatePicker : Control, INotifyPropertyChanged 
{ 
    ... 
    public static readonly DependencyProperty SelectedDateProperty = 
     DependencyProperty.Register("SelectedDate", 
            typeof(DateTime?), 
            typeof(DatePicker), 
            new FrameworkPropertyMetadata(null, 
                    FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, 
                    (sender, e) => 
                    { 
                     var datePicker = sender as DatePicker; 
                     if (datePicker != null) 
                     { 
                      var oldValue = e.OldValue as DateTime?; 
                      DateTime selectedDateForPopup = 
                       datePicker.SelectedDate ?? 
                       DateTime.Now; 
                      datePicker.CurrentlyViewedMonth = 
                       selectedDateForPopup.Month; 
                      datePicker.CurrentlyViewedYear = 
                       selectedDateForPopup.Year; 
                      datePicker.OnDateChanged(datePicker.SelectedDate, oldValue);                    
                      var popup = datePicker.GetTemplateChild(PartPopup) as Popup; 
                      if (popup != null) 
                       popup.IsOpen = false; 
                     } 
                    })); 
    ... //a lot more not so important code here 
} 
+0

quel est le problème exactement? cette date n'apparaît-elle pas dans le fichier datePicker ou la date sélectionnée dans le fichier datepicker n'est-elle pas propagée à votre objet TestClass? Dans ce dernier cas, vous pouvez ajouter un Mode = TwoWay à votre liaison datepicker (ie - SelectedDate = "{Date de liaison, Mode = TwoWay}" –

+0

SelectedDate dans le DataPicker ne parvient pas à mon objet TestClass, et oui, Mode est réglé sur TwoWay partout –

+0

modifiez-vous le code source du DatePicker? Ou le publiez-vous simplement pour notre commodité? –

Répondre

0

Le problème est résolu.

Ce n'était pas dans des liaisons incorrectes ou d'autres choses difficiles et inégales, mais, comme c'était le code hérité, quelque part dans le programmeur de code a fait une erreur.

Merci pour tout!

+0

Ne faisons-nous pas tous des erreurs de temps en temps;) – Arcturus

+0

ouais) mais j'ai passé environ deux jours pour résoudre ce problème et je suis devenu fou –

2

Assurez-vous que vos propriétés jettent l'événement INotifyPropertyChanged:

public class TestClass : INotifyPropertyChanged 
{ 
    private DateTime date; 

    public DateTime Date 
    { 
     get { return date; } 
     set { date = value; NotifyPropertyChanged("Date"); } 
    } 

    private void NotifyPropertyChanged(string info) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 
} 

et faites votre liant à la date aussi TwoWay:

<local:DatePicker SelectedDate="{Binding Date, Mode=TwoWay}"/> 
+0

qu'ils jette, bien sûr, je ne l'ai pas mentionné dans la poste pour diminuer la taille du code –

+0

Check :) .. mettre à jour la réponse un peu: – Arcturus

+0

est réglé sur TwoWay ( –

2

Vérifiez la fenêtre de sortie pour les données des erreurs de liaison ..

erreurs probables:

  • DataContext pas correcte.
  • ListView ItemsSource="{Binding ElementName=this, Path=Items} Is not Items est une propriété de la classe Window ou ViewModel?
+0

DataContext est défini correctement (Les éléments de la collection sont liés à la liste déroulante ItemsSource), c'est juste une application de test simple, la propriété fait partie de la classe Window, le problème est vraiment quelque chose de plus profond je pense –

+0

et non, je ne vois aucune erreur de liaison de données dans la fenêtre de sortie, c'est juste fou) –

Questions connexes