Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Почему не работает Binding? / 5 сообщений из 5, страница 1 из 1
27.10.2010, 19:50
    #36924025
Почему не работает Binding?
Есть следующий класс (модель для контролса):
Код: 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
27.10.2010, 19:52
    #36924027
Почему не работает Binding?
ObservableCollection а не OperationsCollection.
...
Рейтинг: 0 / 0
27.10.2010, 22:17
    #36924245
уТКа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не работает Binding?
Автор___________,

- вы не правильно реализовали 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
28.10.2010, 11:14
    #36924920
Почему не работает Binding?
Реализовал события в представлении и все заработало, спасибо огромное.
Я так понял второй пункт это для двухсторонней связи?
...
Рейтинг: 0 / 0
28.10.2010, 12:25
    #36925166
уТКа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не работает Binding?
Автор___________,

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


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