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
}
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}" –
SelectedDate dans le DataPicker ne parvient pas à mon objet TestClass, et oui, Mode est réglé sur TwoWay partout –
modifiez-vous le code source du DatePicker? Ou le publiez-vous simplement pour notre commodité? –