我有一个用户控件,比如说UC1。此用户控件具有视图模型UC1_vm.。
在用户控件UC1中,我有一个画布,其中实现了绘制曲线逻辑。此绘制曲线逻辑基于视图模型( UC1_vm)中的数据点属性。
视图模型中的数据点属性随条件的不同而变化。数据点的生成是在视图模型中编写的。
我希望将视图模型中的数据点属性绑定到用户控件(视图)内的绘制曲线逻辑。我希望每当在视图模型中更改数据点属性时,画布调用绘图曲线方法。
我可以设置画布的set any属性吗?当更改它时,它会自动调用on画图逻辑?
请建议我实施这个方案的方法!!
发布于 2010-03-13 08:20:58
听起来,您有一个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();
}
发布于 2010-03-10 19:32:47
编辑__:谢谢@Ray的一个相当有效的观点!
如果您的列表实现了INotifyCollectionChanged
接口(例如,ObservableCollection<Point>
,参见ObservableCollection@msdn)或实现INotifyPropertyChanged
的对象(参见INotifyPropertyChanged @msdn),并且您要将这些点绑定到视图,那么它应该自己排序(当然,只要绑定是正确的!)
我提到这一点,因为您表示您使用的是一个列表,它取决于设置的方式,可能只工作一次,但从不更新。
您能用示例代码更新这个问题吗,例如类/WPF标记/视图模型代码等等,以获得更多的指导。在这个空间里有很大的移动空间。
PK :-)
https://stackoverflow.com/questions/2422219
复制相似问题