powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Почему не работает Binding?
5 сообщений из 5, страница 1 из 1
Почему не работает Binding?
    #36924025
Есть следующий класс (модель для контролса):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
public class ArrowDependencyViewModel : BaseViewModel
{		
	Point start;
	Point end;

	public ArrowDependencyViewModel()
	{
	}

	public Point ArrowStart
	{
		get { return start; }
		set
		{
			start = value;
			NotifyPropertyChanged("ArrowStart");
		}
	}

	public Point ArrowEnd
	{
		get { return end; }
		set
		{
			end = value;
			NotifyPropertyChanged("ArrowEnd");
		}
	}
}

public abstract class BaseViewModel : INotifyPropertyChanged
{
	public event PropertyChangedEventHandler PropertyChanged;
	
	protected void NotifyPropertyChanged(String info)
	{
		if (PropertyChanged != null)
		{
			PropertyChanged(this, new PropertyChangedEventArgs(info));
		}
	}
}

Есть представление для этого контролса:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<UserControl x:Class="Arrow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Canvas>
        <Line x:Name="Cap">
            <Line.RenderTransform>
                <RotateTransform x:Name="CapRotateTransform" />
            </Line.RenderTransform>
        </Line>
        <Line x:Name="Connector" />
        <Line x:Name="Foot">
            <Line.RenderTransform>
                <RotateTransform x:Name="FootRotateTransform" />
            </Line.RenderTransform>
        </Line>
    </Canvas>
</UserControl>

и

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
public partial class Arrow : UserControl
{
	Point startPoint;
	Point endPoint;

	public static readonly DependencyProperty StartPointProperty = DependencyProperty.Register
		(
			"StartPoint",
			typeof(Point),
			typeof(Arrow),
			new PropertyMetadata(new Point())
		);

	public Point StartPoint
	{
		get { return startPoint; }
		set
		{
			startPoint = value;
			Update();
		}
	}

	public static readonly DependencyProperty EndPointProperty = DependencyProperty.Register
		(
			"EndPoint",
			typeof(Point),
			typeof(Arrow),
			new PropertyMetadata(new Point())
		);

	public Point EndPoint
	{
		get { return endPoint; }
		set
		{
			endPoint = value;
			Update();
		}
	}

	public Arrow()
	{
		InitializeComponent();
	}

	private void Update()
	{
		//Тут обновляются Cap, Connector и Foot согласно полученым точкам
	}
}

Контролсы создаются следующим образом:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
<ItemsControl ItemsSource="{Binding ArrowDependencies}">
	<ItemsControl.ItemTemplate>
		<DataTemplate>
			<local:Arrow StartPoint="{Binding ArrowStart}"
					  EndPoint="{Binding ArrowEnd}">
			</local:Arrow>
			
			<!--Если раскомментить этот код и закомментить local:Arrow то привязка работает нормально-->
			<!--<Path StrokeThickness="3" 
				  StrokeStartLineCap="Round" 
				  StrokeEndLineCap="Triangle" 
				  Stroke="Red">
				<Path.Data>
					<LineGeometry StartPoint="{Binding ArrowStart}" EndPoint="{Binding ArrowEnd}"/>
				</Path.Data>
			</Path>-->
		</DataTemplate>
	</ItemsControl.ItemTemplate>

	<ItemsControl.ItemsPanel>
		<ItemsPanelTemplate>
			<Canvas />
		</ItemsPanelTemplate>
	</ItemsControl.ItemsPanel>
</ItemsControl>

ArrowDependencies это OperationsCollection моделей контролса. При изменении полей у ArrowDependencyViewModel ничего не происходит. Но если заменить Arrow на Path все работает нормально. Если значения StartPoint и EndPoint задать вручную в замле, то так же все работает. Еще заметил что если привязке добавить конвертер, то конвертер отработает, но Arrow не получит значение.
Использую Silverlight 4.
...
Рейтинг: 0 / 0
Почему не работает Binding?
    #36924027
ObservableCollection а не OperationsCollection.
...
Рейтинг: 0 / 0
Почему не работает Binding?
    #36924245
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор___________,

- вы не правильно реализовали DependencyProperty, в частности, у такового есть событийный метод на изменение данных.
пример:
автор
public static readonly DependencyProperty StartPointProperty = DependencyProperty.Register
(
"StartPoint",
typeof(Point),
typeof(Arrow),
new PropertyMetadata(new Point(), OnStartPointPropertyChanged)
);

private static void OnStartPointPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Arrow control = d as Arrow;
if (control == null)
{
return;
}

control.Update();

}


- публичные свойства завязанные на DependencyProperty не правильно реализованы, уберите ваши приватные свойста и сделайте завязку на DependencyProperty

пример:
автор
public Point ArrowStart
{
get { return (Point)GetValue(this.StartPointProperty); }
set
{
SetValue(this.StartPointProperty, value);
NotifyPropertyChanged("ArrowStart");
}
}



т.к. вы не сделали завязку на DependencyProperty, которые отвечают за актуальность данных в UI, изменения произойдут только в коде.
...
Рейтинг: 0 / 0
Почему не работает Binding?
    #36924920
Реализовал события в представлении и все заработало, спасибо огромное.
Я так понял второй пункт это для двухсторонней связи?
...
Рейтинг: 0 / 0
Почему не работает Binding?
    #36925166
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор___________,

да, для двусторонней связи.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Почему не работает Binding?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]