WPF Polyline不会在绑定点后使视觉无效

时间:2011-10-16 17:27:45

标签: wpf data-binding

我对Polyline类有一个奇怪的问题,它有Points属性。当我在XAML中明确设置Points属性时,它呈现正常,稍后在代码后面,例如我更改第一个点并正确刷新UI。

<Polyline Name="plLine" Points="0 0 100 100 100 200 200 200"
                      Stroke="Black"
                      StrokeThickness="1" />

以及后面的代码:

private void Button2_Click(object sender, RoutedEventArgs e)
{
    plLine.Points[0] = new Point(10, 10);    
}

对此很好。

但是当我使用来自ViewModel的相同数据绑定Points属性时,例如:

<Polyline Name="plLine" Points="{Binding PointCollection}"
                      Stroke="Black"
                      StrokeThickness="1" />

并尝试执行我后面的代码,不会刷新渲染的内容。

为什么会出现这种情况?

1 个答案:

答案 0 :(得分:2)

你在breaking the binding。您已经将您的积分绑定到属性PointCollection,然后从您的代码后面设置它,从而覆盖绑定。之后,当您在ViewModel中更改PointCollection时,即使您已为您的类实现了INotifyPropertyChanged,也不会在视图中注意到更改。

你可以试试这个小样本 -

  • 在视图上放置一个文本框,并将其文本属性绑定到viewmodel中的某个属性,例如此属性的值为“Test”
  • 现在在视图上放置两个按钮。
  • 点击第一个按钮,只需将文本框的文本设置为“Button1”。
  • 您会注意到文本框文本现在将是“Button1”。
  • 现在点击第二个按钮,尝试将Viewmodel属性设置为“Button2”。 PropertyChanged将被解雇,但您不会注意到文本框文本中的任何更改。

由于通过显式设置文本框的Text属性来破坏绑定。

因此,您应该始终通过其来源设置您的绑定属性。在您的情况下,只需使用INPC设置Viewmodel的属性PointCollection,即可查看视图上的更改。

修改 由于它绑定到PointCollection属性,这就是为什么更改集合中的单个值将不会在UI上更新它。您必须通过将绑定设置为新的PointCollection值来完全删除绑定。你不能同时拥有这两个。看看这段代码 -

private void Button_Click(object sender, RoutedEventArgs e)
{
  List<Point> pts = new List<Point>();
  pts.Add(new Point(20, 20));
  pts.Add(new Point(100, 100));
  pts.Add(new Point(100, 200));
  pts.Add(new Point(200, 200));
  this.plLine.Points = new PointCollection(pts);
  //this.plLine.SetCurrentValue(Polyline.PointsProperty, new PointCollection(pts));
}

您需要将其完全设置为新集合。如果您希望通过直接设置上面提到的方式来破坏绑定,请取消注释我的最后一行并注释最后一行。这样你的绑定将保持不变。