关于WPF中MVVM模式的问题?

时间:2010-03-11 02:57:28

标签: wpf wpf-controls binding

我有一个用户控件,请说 UC1 。此用户控件具有viewmodel UC1_vm。

在usercontrol UC1中,我有一个画布,其中实现了绘制曲线逻辑。此绘制曲线逻辑基于视图模型(UC1_vm)中的数据点属性。

视图模型中的数据点属性随着条件的不同而变化。数据点的生成写在视图模型中。

我想将视图模型中的数据点属性绑定到User控件(视图)内的绘制曲线逻辑。我希望只要在视图模型中更改数据点属性,画布就会调用绘制曲线方法。

我可以设置canvas的任何属性,当更改它时会自动调用on paint逻辑吗?

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

2 个答案:

答案 0 :(得分:0)

编辑 :感谢@Ray Burns提供了一个相当有效的观点!

如果您的列表实现了INotifyCollectionChanged界面(例如ObservableCollection<Point>,请参阅ObservableCollection@msdn)或对象实现INotifyPropertyChanged(请参阅INotifyPropertyChanged @msdn)并且您具有约束力然后它应该对视图进行排序(只要绑定是正确的!)

我提到这是因为你表示你使用了一个List,这取决于设置的方式可能只工作一次但从不更新。

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

PK: - )

答案 1 :(得分:0)

听起来你有一个DependencyProperty,它是UserControl中的点集合。注册时,请使用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();
}