[英]Binding doesn't work in ListView
我有一個名為DataPicker的wpf控件,該控件具有一個名為SelectedDate的依賴項屬性。
在簡單的情況下,它可以很好地工作,但是在某些情況下,綁定失敗,我不明白為什么:當我嘗試將其綁定到ListView中時。
例如,我有一個類(實現了INotifyPropertyChanged)
public class TestClass : INotifyPropertyChanged
{
public string Name { get; set; }
public DateTime Date { get; set; }
}
並嘗試像這樣綁定樣本集合
public ObservableCollection<TestClass> Items { get; set; }
其中包含一個元素。
綁定看起來像
<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>
和Name屬性工作正常。
在我的DatePicker日期值中的顯示方式如下:
<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>
任何想法為什么會發生這種情況?
DatePicker類的更多代碼:(我寧願錯過一些特定的屬性,以免代碼太大)
[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
}
確保您的屬性引發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));
}
}
}
並將您與日期的綁定也設為TwoWay:
<local:DatePicker SelectedDate="{Binding Date, Mode=TwoWay}"/>
檢查輸出窗口中是否有任何數據綁定錯誤。
可能的錯誤:
ListView ItemsSource="{Binding ElementName=this, Path=Items}
Items不是Window或ViewModel類的屬性嗎? 問題已經解決了。
它不是錯誤的綁定或其他困難且參差不齊的內容,而是因為它是遺留代碼,所以代碼程序員中的某個地方犯了錯誤。
謝謝大家!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.