在itemssource更新时更新WPF usercontrol中的项目集合

时间:2012-07-07 12:37:05

标签: c# wpf xaml user-controls

我有一个带有对象集合的自定义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 值更改时更新积分集合?

1 个答案:

答案 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 });
    }
}