Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Помогите с DependencyProperty / 25 сообщений из 26, страница 1 из 2
01.02.2011, 13:02
    #37090459
xpoft2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с DependencyProperty
Разбирался как работают DependencyProperty и наткнулся на определенного рода проблему:

Сделал новое окно, определил в нем DependencyProperty
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public partial class DepPropWindow : Window
    {
        public Visibility Test
        {
            get { return (Visibility)GetValue(DepPropWindow.TestProperty); }
            set { SetValue(DepPropWindow.TestProperty, value); }
        }
        public static readonly DependencyProperty TestProperty = DependencyProperty.Register("Test", typeof(Visibility), typeof(DepPropWindow), new PropertyMetadata(Visibility.Visible));

        public DepPropWindow()
        {
            InitializeComponent();            
        }
    }

а дальше совершенно непонятно как к нему обратится из xaml разметки, делаю так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<local:DepPropWindow x:Class="DependencyPropertyTest.DepPropWindow"
        xmlns:local="clr-namespace:DependencyPropertyTest"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="DepPropWindow" Height="300" Width="300" x:Name="MyWindow"                     
        Test="Collapsed">
    <Window.Resources>        
    </Window.Resources>
    <Grid>
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="61,114,0,0" Name="button1" VerticalAlignment="Top" Width="75" Visibility="{Binding ElementName=MyWindow, Path=Test}"/>
    </Grid>
</local:DepPropWindow>

естественно становится видным и могу обратится, но при этом получаю ошибку:
Код: plaintext
1.
Error	1	Циклическая зависимость между базовыми классами 'DependencyPropertyTest.DepPropWindow' и 'DependencyPropertyTest.DepPropWindow'	C:\Users\Serjick\documents\visual studio 2010\Projects\DependencyPropertyTest\DependencyPropertyTest\DepPropWindow.xaml.cs	19	26	DependencyPropertyTest

В итоге получаем, что из xaml для окна можно обратится к DependencyProperty определенным в классах родителях, но это как то неправильно мне кажется. Подскажите, что не так делаю?

PS: понятное дело, что для элементов расположенных внутри окна мы так и так сделаем класс и тогда в разметке будем иметь доступ к DependencyProperty определенным в нем, но как быть с элементами самого верхнего уровня?
...
Рейтинг: 0 / 0
01.02.2011, 15:38
    #37091040
Руки-крюки
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с DependencyProperty
xpoft2010,

Вы понимаете что тут:
Код: plaintext
1.
2.
3.
4.
        public Visibility Test
        {
            get { return (Visibility)GetValue(DepPropWindow.TestProperty); }
            set { SetValue(DepPropWindow.TestProperty, value); }
        }
вы написали буквально это:
Код: plaintext
1.
2.
3.
4.
        public Visibility Test
        {
            get { return Test; }
            set { Test = value; }
        }
?
...
Рейтинг: 0 / 0
01.02.2011, 16:00
    #37091125
xpoft2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с DependencyProperty
не совсем понял вопрос,
- Это стандартное объявление DependencyProperty.

Суть моего вопроса не в этом, а вот в чем:

верхний элемент окна это <Window> - класс который не содержит у себя описанного мной DependencyProperty TestProperty.
Когда я указываю в кач-ве верхнего элемента мой класс (наследник от Window), то получаю ошибку:

авторError 1 Циклическая зависимость между базовыми классами 'DependencyPropertyTest.DepPropWindow' и 'DependencyPropertyTest.DepPropWindow' C:\Users\Serjick\documents\visual studio 2010\Projects\DependencyPropertyTest\DependencyPropertyTest\DepPropWindow.xaml.cs 19 26 DependencyPropertyTest
...
Рейтинг: 0 / 0
01.02.2011, 16:01
    #37091128
Руки-крюки
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с DependencyProperty
Вообще вас понесло не в ту степь. Начните с самого простого примера привязки:
Код: plaintext
1.
<TextBox x:Name="textBox" />
<Button Content="{Binding ElementName=textBox, Path=Text}" />
Что тут происходит:
1. Вы указали для текст бокса имя x:Name="textBox" и он стал виден в коде окна.
2. Затем вы указали для кнопки ElementName=textBox. При этом привязка ищет в коде окна елемент управления с именем textBox. Если бы мы не указывали этого, то привязка бы взяла объект из свойства DataContext кнопки и работало бы с ним. К слову сказать, дата контекст используется при реализации патерна MVVM. Еще есть вариант когда в место ElementName указывается Source, в таком случае привязка ищет в классе окна проперти по указаному имени. И потом работает с обьектом который возвращает проперти, если там конечно объект.
3. Дальше вы указали Path=Text. Привязка берет значение этого проперти и присваивает его в Content кнопки.
...
Рейтинг: 0 / 0
01.02.2011, 16:06
    #37091153
Руки-крюки
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с DependencyProperty
xpoft2010не совсем понял вопрос,
- Это стандартное объявление DependencyProperty.

Суть моего вопроса не в этом, а вот в чем:

верхний элемент окна это <Window> - класс который не содержит у себя описанного мной DependencyProperty TestProperty.
Когда я указываю в кач-ве верхнего элемента мой класс (наследник от Window), то получаю ошибку:

авторError 1 Циклическая зависимость между базовыми классами 'DependencyPropertyTest.DepPropWindow' и 'DependencyPropertyTest.DepPropWindow' C:\Users\Serjick\documents\visual studio 2010\Projects\DependencyPropertyTest\DependencyPropertyTest\DepPropWindow.xaml.cs 19 26 DependencyPropertyTest

У вас есть проперти, которое создает рекурсию (!!!). В какой-то момент этому проперти что-то присваивается (а именно при вызове статического метода Register, он там значение по умолчанию выставляет в проперти) и естественно приложение вылетает.
...
Рейтинг: 0 / 0
01.02.2011, 16:09
    #37091169
xpoft2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с DependencyProperty
Смотреть как работают Binding'и можно было меня и к RTFM послать ;)

А мне хочется получить ответ на вопрос: Как в xaml разметке добраться до DependencyProperty описанного в классе этого окна?
...
Рейтинг: 0 / 0
01.02.2011, 16:10
    #37091176
Шайтан
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с DependencyProperty
xpoft2010,

нэймспейс локальный объявил?
...
Рейтинг: 0 / 0
01.02.2011, 16:11
    #37091179
Шайтан
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с DependencyProperty
ЗЫ в смысле правильно объявил? :)
...
Рейтинг: 0 / 0
01.02.2011, 16:12
    #37091184
xpoft2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с DependencyProperty
Руки-крюкиxpoft2010не совсем понял вопрос,
- Это стандартное объявление DependencyProperty.

Суть моего вопроса не в этом, а вот в чем:

верхний элемент окна это <Window> - класс который не содержит у себя описанного мной DependencyProperty TestProperty.
Когда я указываю в кач-ве верхнего элемента мой класс (наследник от Window), то получаю ошибку:

пропущено...

У вас есть проперти, которое создает рекурсию (!!!). В какой-то момент этому проперти что-то присваивается (а именно при вызове статического метода Register, он там значение по умолчанию выставляет в проперти) и естественно приложение вылетает.

Ну вот как раз и подобрались, к тому, а как же сделать так, чтобы я увидел св-во Test и оно стало доступным для Binding'а кнопке?

PS: Приложение не вылетает, компилятор проект не выпускает при таком подходе.
...
Рейтинг: 0 / 0
01.02.2011, 16:14
    #37091191
xpoft2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с DependencyProperty
ШайтанЗЫ в смысле правильно объявил? :)

да, и руками вводил и intelli sens'ом выбирал, мало-ли, вдруг ошибочка закралась.
...
Рейтинг: 0 / 0
01.02.2011, 16:15
    #37091199
Руки-крюки
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с DependencyProperty
xpoft2010,

Код: 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.
        public static readonly DependencyProperty StartPointProperty = DependencyProperty.Register
            (
                "StartPoint",
                typeof(Point),
                typeof(Arrow),
                new PropertyMetadata(new Point(), OnStartPointPropertyChanged)
            );

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

            control.StartPoint = (Point)e.NewValue;
        }

        Point startPoint;

        public Point StartPoint
        {
            get { return startPoint; }
            set
            {
                startPoint = value;
            }
        }
...
Рейтинг: 0 / 0
01.02.2011, 16:22
    #37091226
xpoft2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с DependencyProperty
В коде я могу добраться до св-ва, а в xaml? Главная проблема в этом заключается, что там то его не видно, потому что класс Window не имеет в своем арсенале такого св-ва.

Причем вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<local:DepPropWindow x:Class="DependencyPropertyTest.DepPropWindow"
        xmlns:local="clr-namespace:DependencyPropertyTest"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="DepPropWindow" Height="300" Width="300" x:Name="MyWindow"                     
        Test="Collapsed">
    <Window.Resources>        
    </Window.Resources>
    <Grid>
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="61,114,0,0" Name="button1" VerticalAlignment="Top" Width="75" Visibility="{Binding ElementName=MyWindow, Path=Test}"/>
    </Grid>
</local:DepPropWindow>
с точки зрения синтаксиса компилятор удовлетворяет:
...
Рейтинг: 0 / 0
01.02.2011, 16:26
    #37091238
Руки-крюки
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с DependencyProperty
xpoft2010,

Весь код покажите. И покажите где вы хотите заюзать ваше проперти.
...
Рейтинг: 0 / 0
01.02.2011, 16:27
    #37091239
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с DependencyProperty
xpoft2010,

Циклическая зависимость здесь
<local: DepPropWindow x:Class="DependencyPropertyTest. DepPropWindow "
...
Рейтинг: 0 / 0
01.02.2011, 16:31
    #37091250
Руки-крюки
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с DependencyProperty
xpoft2010,

Кароче вы меня запутали окончательно=)
...
Рейтинг: 0 / 0
01.02.2011, 16:31
    #37091252
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с DependencyProperty
как вариант - промежуточный базовый класс
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
    public class TestedWindow : Window
    {
        public Visibility Test
        {
            get { return (Visibility)GetValue(TestedWindow.TestProperty); }
            set { SetValue(TestedWindow.TestProperty, value); }
        }
        public static readonly DependencyProperty TestProperty = DependencyProperty.Register("Test", typeof(Visibility), typeof(TestedWindow), new PropertyMetadata(Visibility.Visible));
    }
и тогда
<local:TestedWindow x:Class="DependencyPropertyTest.DepPropWindow"
...
Рейтинг: 0 / 0
01.02.2011, 16:32
    #37091253
xpoft2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с DependencyProperty
LRxpoft2010,

Циклическая зависимость здесь
<local: DepPropWindow x:Class="DependencyPropertyTest. DepPropWindow "

Угу, циклическая со всех сторон: так компилятор не выпускает, а если написать:
Код: plaintext
1.
<Window x:Class="DependencyPropertyTest.DepPropWindow"> ... </Window>
то в xaml мы не увидим св-во Test
...
Рейтинг: 0 / 0
01.02.2011, 16:34
    #37091255
xpoft2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с DependencyProperty
xpoft2010...
В итоге получаем, что из xaml для окна можно обратится к DependencyProperty определенным в классах родителях, но это как то неправильно мне кажется. Подскажите, что не так делаю?

PS: понятное дело, что для элементов расположенных внутри окна мы так и так сделаем класс и тогда в разметке будем иметь доступ к DependencyProperty определенным в нем, но как быть с элементами самого верхнего уровня?

Да, об этом писал тут.

ЗЫ: Прилагается весь проект.
...
Рейтинг: 0 / 0
01.02.2011, 16:38
    #37091269
xpoft2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с DependencyProperty
LRкак вариант - промежуточный базовый класс
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
    public class TestedWindow : Window
    {
        public Visibility Test
        {
            get { return (Visibility)GetValue(TestedWindow.TestProperty); }
            set { SetValue(TestedWindow.TestProperty, value); }
        }
        public static readonly DependencyProperty TestProperty = DependencyProperty.Register("Test", typeof(Visibility), typeof(TestedWindow), new PropertyMetadata(Visibility.Visible));
    }
и тогда
<local:TestedWindow x:Class="DependencyPropertyTest.DepPropWindow"

так однозначно будет работать, просто неужели нет возможности сразу достать? А если в проекте 200-300 окон и для каждого надо создавать разные DP, конечно маловероятна такая необходимость, но все таки=)
...
Рейтинг: 0 / 0
01.02.2011, 17:15
    #37091378
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с DependencyProperty
xpoft2010Да, об этом писал тут.да, недосмотрел...

ну, тогда (как еще один вариант) попробуйте Attached Property
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
        public static readonly DependencyProperty TestProperty = DependencyProperty.RegisterAttached("Test", typeof(Visibility), typeof(DepPropWindow), new PropertyMetadata(Visibility.Visible));
        public static void SetTest(Window window, Visibility value)
        {
            window.SetValue(TestProperty, value);
        }
        public static Visibility GetTest(Window window)
        {
            return (Visibility)window.GetValue(TestProperty);
        }
и в замеле
local:MainWindow.Test="Collapsed"

правда, дотягиваться до него не очень
if (DepPropWindow.GetTest(this) == Visibility.Collapsed) {
System.Diagnostics.Debug.WriteLine("Collapsed!");
}
...
Рейтинг: 0 / 0
01.02.2011, 17:19
    #37091387
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с DependencyProperty
и в замеле
local:MainWindow.Test="Collapsed"
local:DepPropWindow.Test="Collapsed"
(MainWindow - в моем примерчике)
...
Рейтинг: 0 / 0
02.02.2011, 11:05
    #37092473
xpoft2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с DependencyProperty
Вот что еще по теме нашел на GotDotNet
http://www.gotdotnet.ru/forums/14/110081/520205/#post520205 , там в рассуждениях показано как вытащить св-во через ресурс, но в этом случае непонятно как обновлять целевое св-во забинденного объекта на этот ресурс.
...
Рейтинг: 0 / 0
02.02.2011, 13:13
    #37092948
уТКа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с DependencyProperty
@автор
если тебе необходимо забиндиться на проперти родителя, необходимо сделать всего лишь
Код: plaintext
1.
<Button Content="Test" Visibility="{Binding Path=TestProperty}"/>
т.к. DataContext у всех контролов по умолчанию Родительский класс.
...
Рейтинг: 0 / 0
02.02.2011, 15:52
    #37093409
уТКа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с DependencyProperty
извиняйте, не много промахнулся.
нужно конечно же биндиться на саму пропертю, а не на DependencyProperty
Код: plaintext
1.
<Button Content="Test" Visibility="{Binding Path=Test}"/>
...
Рейтинг: 0 / 0
03.02.2011, 16:31
    #37095842
xpoft2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с DependencyProperty
уТКа@автор
если тебе необходимо забиндиться на проперти родителя, необходимо сделать всего лишь
Код: plaintext
1.
<Button Content="Test" Visibility="{Binding Path=TestProperty}"/>
т.к. DataContext у всех контролов по умолчанию Родительский класс.

Может я ошибаюсь, но DataContext у дочернего контрола это DataContext родительского контрола, а не сам родительский класс?

авторизвиняйте, не много промахнулся.
нужно конечно же биндиться на саму пропертю, а не на DependencyProperty
Код: plaintext
1.
<Button Content="Test" Visibility="{Binding Path=Test}"/>


Собственно так будет работать если написать в конструкторе: this.DataContext = this;

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


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