我有一个带有对象集合的自定义WPF UserControl。
public class MyUserControl : UserControl
{
public readonly static DependencyProperty PointsSourceProperty =
DependencyProperty.Register("PointsSource", typeof(IEnumerable), typeof(MyUserControl), new FrameworkPropertyMetadata(null, OnPointsSourceChanged));
public IEnumerable PointsSource
{
get { return GetValue(PointsSourceProperty) as IEnumerable; }
set { SetValue(PointsSourceProperty, value); }
}
private ObservableCollection<DataPoint> _points = new ObservableCollection<DataPoint>();
public ObservableCollection<DataPoint> Points
{
get { return points; }
}
private static void OnPointsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
// Expect to update Points collection
}
}
public class DataPoint : DependencyObject
{
public readonly static DependencyProperty TimeProperty =
DependencyProperty.Register("Time", typeof(DateTime), typeof(DataPoint));
public readonly static DependencyProperty ValueProperty =
DependencyProperty.Register("Value", typeof(double), typeof(DataPoint));
public DateTime Time
{
get { return (DateTime)GetValue(DateTimeProperty); }
set { SetValue(DateTimeProperty, value); }
}
public double Value
{
get { return (double)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
}
我像这样定义我的控件,其中Data是视图模型中的可观察集合:
<my:myUserControl PointsSource="{Binding Data}">
<my:myUserControl.Points>
<my:Point Time="{Binding TimeUtc}" Value="{Binding Value}" />
</my:myUserControl.Points>
</my:myUserControl>
如何在 PointsSource 值更改时更新积分集合?
答案 0 :(得分:0)
试试这个:
private static void OnPointsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MyUserControl control = d as MyUserControl;
// you have to replace ViewModelItemClass with the name of your class T
// in ObservableCollection<T> from the property Data in your ViewModel
var sourceCollection = e.NewValue as IEnumerable<ViewModelItemClass>;
control._points.Clear();
foreach (var item in sourceCollection)
{
control._points.Add(new DataPoint { Time = item.TimeUtc, Value = item.Value });
}
}