WPF Polyline не делает визуальный недействительным после привязки точек - PullRequest
2 голосов
/ 16 октября 2011

У меня странная проблема с классом Polyline и его свойством Points. Когда я явно устанавливаю свойство Points в XAML, оно отображается нормально, позже в коде, например, я изменяю первую точку, и он корректно обновляет интерфейс.

<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);    
}

с этим все в порядке.

Однако, когда я связываю свойство Points с теми же данными из моей ViewModel, например:

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

и попытка выполнить мой код за ним не обновляет то, что отображается.

Почему это поведение?

1 Ответ

2 голосов
/ 16 октября 2011

Вы breaking the binding здесь. Вы связали свои точки со свойством PointCollection и там после того, как вы установили его из своего кода, тем самым переопределяя привязку. Впоследствии, когда вы измените PointCollection в вашей ViewModel, в вашем представлении не будет замечено никаких изменений, даже если вы внедрили INotifyPropertyChanged для своего класса.

Вы можете попробовать этот маленький образец для этого -

  • Поместите текстовое поле в ваше представление и привяжите его текстовое свойство к какому-либо свойству в вашей модели представления. Скажите, что значение этого свойства - «Тест»
  • Теперь поместите две кнопки на ваш вид.
  • При первом нажатии кнопки просто установите текст вашего текстового поля на что-то вроде «Button1».
  • Вы заметите, что текстовое поле теперь будет «Button1».
  • Теперь при втором нажатии кнопки попробуйте установить в свойстве Viewmodel значение «Button2». PropertyChanged будет запущен, но вы не заметите никаких изменений в текстовом поле.

Поскольку привязка была нарушена путем явной установки свойства Text вашего текстового поля.

Итак, вы всегда должны устанавливать свойство binded через его источник. В вашем случае просто установите свойство PointCollection вашей Viewmodel с INPC, чтобы увидеть изменения в представлении.

Edit: Так как оно привязано к свойству PointCollection, поэтому изменение одного значения в коллекции не будет обновлять его в пользовательском интерфейсе. Вы должны полностью удалить привязку, установив для нее новое значение 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));
}

Вам нужно установить его полностью в новую коллекцию. Если вы хотите, чтобы привязка не была нарушена установкой напрямую, как я упоминал выше, раскомментируйте мою последнюю строку и прокомментируйте вторую последнюю строку. Таким образом, ваша привязка останется без изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...