WPF 轻松监听属性值的改变 神奇类:DependencyPropertyDescriptor
1. 两个ComboBox,一个是开始时间一个是结束时间
2. 它们的ItemsSource通过绑定添加,结束时间要根据开始时间的改变重新加载项()
这第二个的改变是容易做(请看下面的xaml代码),但通过绑定改变了ItemsSource之后,ComboBox的默认选项就没有啦~~但是这个ComboBox又没有ItemsSource Change事件让我们来给它强制选择~~哈哈 这个时候就该DependencyPropertyDescriptor上场了~~
先别急着看DependencyPropertyDescriptor,咱们先把基本代码拿来照个面儿:
1. 定义一个时间表,开始时间就是这个表,结束时间则取开始时间之后的数据
时间列表初始化代码
public static ObservableCollection<string> HalfHourList
{
get
{
if (halfHourList == null)
{
//时间是半个小时的间隔, 0:00, 0:30, 1:00.。。
halfHourList = new ObservableCollection<string>();
DateTime tmp = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 0, 0);
for (int i = 0; i < 48; i++)
{
halfHourList.Add(tmp.Add(TimeSpan.FromMinutes(i * 30)).ToShortTimeString());
}
}
return halfHourList;
}
}
2. UI页面的布局情况
代码(xaml)
<Window.Resources>
<converter:IndexToTimeCollectionConverter x:Key="IndexToTimeCollectionConverter">converter:IndexToTimeCollectionConverter>
Window.Resources>
<Grid>
<Label Margin="163,30,172,207">TimeLabel>
<ComboBox x:Name="startTimeBox" ItemsSource="{Binding Path=HourStart}" SelectedIndex="0" Margin="203,30,78,207">ComboBox>
<Label Margin="163,52,172,185">TimeLabel>
<ComboBox Margin="203,55,78,182" Name="endTimeBox" ItemsSource="{Binding ElementName=startTimeBox, Path=SelectedIndex,Converter={StaticResource IndexToTimeCollectionConverter}}" SelectedIndex="0">ComboBox>
Grid>
Window>
3. 绑定的属性
绑定属性代码
DateTime start;
public DateTime StartTime
{
set
{
this.start = value;
if (this.EndTime < this.start)
this.EndTime = this.start;
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs("StartTime"));
}
get
{
return this.start;
}
}
DateTime end;
public DateTime EndTime
{
set
{
this.end = value;
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs("EndTime"));
}
get
{
return this.end;
}
}
4. 看看这个Converter
拿开始时间之后的时间段Converter
public class IndexToTimeCollectionConverter:IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
int index = int.Parse(value.ToString());
return AppContext.HalfHourList.Skip(index);
}
}
5. 好啦 该咱们的英雄上场了~~DependencyPropertyDescriptor,这段代码就放到初始化的地方就好啦
代码
DependencyPropertyDescriptor descriptor = DependencyPropertyDescriptor.FromProperty(ComboBox.ItemsSourceProperty, typeof(ComboBox));
descriptor.AddValueChanged(endTimeBox, (o, e) =>
{
if (endTimeBox.ItemsSource != null)
{
endTimeBox.SelectedIndex = 0;
}
});
大功告成!
当然,这个类的功能还很强大,但只这个功能就让我欣喜了,对于没有属性变更的类,几行代码轻松搞定,不用写那么多的附加属性啊,事件啊之类的了。
欢迎讨论~~