问对WPF MVVM模式?(Question on MVVM pattern on WPF?)

2019-10-20 07:43发布

我有一个用户控制让说UC1。 这个用户控件具有视图模型UC1_vm。

在用户控件UC1我具有其中绘制曲线逻辑被实现的画布。 该图中曲线逻辑是基于视图模型(UC1_vm)数据点属性。

数据点用不同的条件视图模型改变内部属性。 数据点的产生是写在视图模型。

我想数据点属性绑定在视图模型的用户控制(视图)内的拉伸曲线的逻辑。 我想只要数据点属性在视图模型改变,画布调用画曲线的方法。

我可以设置设置哪些改变时,它调用油漆逻辑自动matically帆布的任何财产?

请给我建议实施此方案的方法!

Answer 1:

这听起来像你有一个DependencyProperty是点的集合中的用户控件。 当你注册,使用FrameworkPropertyMetadata元数据,并指定FrameworkPropertyMetadataOptions.AffectsRender在元数据构造。 请注意,如果整个集合被替换,这只会工作(如果你提出的PropertyChanged收集,但集合实例并没有改变,你的油漆仍然不会被调用)。

如果您的集合实现INotifyCollectionChanged ,那么你就可以将一个集合改变事件处理程序,无效的视觉:

public static DependencyProperty PointsProperty = DependencyProperty.Register(
    "Points",
    typeof(IEnumerable<Point>),
    typeof(UC1),
    new FrameworkPropertyMetadata(null, 
        FrameworkPropertyMetadataOptions.AffectsRender,
        OnPointsChanged));

public IEnumerable<Point> Points
{
    get { return (IEnumerable<Point>)GetValue(PointsProperty); }
    set { SetValue(PointsProperty, value); }
}

private static void OnPointsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    UC1 ctrl = d as UC1;
    if (e.NewValue != null && e.NewValue is INotifyCollectionChanged)
        ((INotifyCollectionChanged)e.NewValue).CollectionChanged += ctrl.PointsChanged;

    if (e.OldValue != null && e.OldValue is INotifyCollectionChanged)
        ((INotifyCollectionChanged)e.OldValue).CollectionChanged -= ctrl.PointsChanged;
}

private void PointsChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    InvalidateVisual();
}


Answer 2:

编辑 :感谢@Ray伯恩斯一个相当有效的点!

如果您的列表实现了INotifyCollectionChanged接口(例如ObservableCollection<Point> ,看到的ObservableCollection @ MSDN )或对象实现INotifyPropertyChanged (见INotifyPropertyChanged的@msdn )和你结合点到视图,那么它应该只要自行解决(如结合是正确的,当然!)

我提到,你曾表示你正在使用,要看事情是如何建立可使用一次,但从来没有更新列表。

你可以更新示例代码,例如类/ WPF标记/视图模型代码等问题,以获得更多的指导。 有一个很大的空间在这个空间中移动...

PK :-)



文章来源: Question on MVVM pattern on WPF?