【问题标题】:Question on MVVM pattern on WPF?关于 WPF 中的 MVVM 模式的问题?
【发布时间】:2011-01-26 04:55:25
【问题描述】:

我有一个用户控件,比如说 UC1 。此用户控件具有视图模型 UC1_vm.

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

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

我想将视图模型中的数据点属性绑定到用户控件(视图)内的绘制曲线逻辑。我希望每当视图模型中的数据点属性发生变化时,画布都会调用绘制曲线方法。

我可以设置画布的任何属性,当更改时它会自动调用绘制逻辑?

请建议我实现这个场景的方法!!

【问题讨论】:

  • -1:这是一个非常糟糕的标题。请编辑标题以反映您的问题更具体的内容。
  • 这个问题的标题仍然需要认真工作,恕我直言。它至少应该提到您的视图绑定到视图模型中的数据点列表。

标签: wpf wpf-controls binding


【解决方案1】:

听起来您有一个 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();
}

【讨论】:

    【解决方案2】:

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

    如果您的列表实现INotifyCollectionChanged 接口(例如ObservableCollection&lt;Point&gt;,请参阅ObservableCollection@msdn)或对象实现INotifyPropertyChanged(请参阅INotifyPropertyChanged @msdn)并且您将点绑定到视图,那么它应该自行排序out(当然只要绑定是正确的!)

    我提到是因为您表示您使用的是一个列表,这取决于设置的方式可能会工作一次但永远不会更新。

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

    PK :-)

    【讨论】:

    • 感谢 Paul 的快速回复。是的,我确实实现了 INotifyPropetyChanged 接口。我的问题是我在视图中绑定 List 点(视图模型中的属性),以便它在视图中调用绘制曲线方法?
    • 您的意思是说INotifyCollectionChanged 而不是INotifyPropertyChanged。 ObservableCollection 确实 也实现了INotifyPropertyChanged,但它仅在 Count 属性更改时触发,而不是在替换集合成员时触发。顺便说一句,两周前我犯了完全相同的错误,并且 itowlson 纠正了我,所以我知道即使使用了多年和多年,两者也很容易混淆。
    猜你喜欢
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 2010-12-15
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    相关资源
    最近更新 更多