我有一个用户控件,请说 UC1 。此用户控件具有viewmodel UC1_vm。
在usercontrol UC1中,我有一个画布,其中实现了绘制曲线逻辑。此绘制曲线逻辑基于视图模型(UC1_vm)中的数据点属性。
视图模型中的数据点属性随着条件的不同而变化。数据点的生成写在视图模型中。
我想将视图模型中的数据点属性绑定到User控件(视图)内的绘制曲线逻辑。我希望只要在视图模型中更改数据点属性,画布就会调用绘制曲线方法。
我可以设置canvas的任何属性,当更改它时会自动调用on paint逻辑吗?
请建议我实施此方案的方法!!
答案 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();
}