powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Помогите с DependencyProperty
25 сообщений из 26, страница 1 из 2
Помогите с DependencyProperty
    #37090459
xpoft2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разбирался как работают 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
Помогите с DependencyProperty
    #37091040
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Помогите с DependencyProperty
    #37091125
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
...
Рейтинг: 0 / 0
Помогите с DependencyProperty
    #37091128
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще вас понесло не в ту степь. Начните с самого простого примера привязки:
Код: 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
Помогите с DependencyProperty
    #37091153
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Помогите с DependencyProperty
    #37091169
xpoft2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Смотреть как работают Binding'и можно было меня и к RTFM послать ;)

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

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

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

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

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

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

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

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

да, и руками вводил и intelli sens'ом выбирал, мало-ли, вдруг ошибочка закралась.
...
Рейтинг: 0 / 0
Помогите с DependencyProperty
    #37091199
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Помогите с DependencyProperty
    #37091226
xpoft2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В коде я могу добраться до св-ва, а в 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
Помогите с DependencyProperty
    #37091238
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xpoft2010,

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

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

Кароче вы меня запутали окончательно=)
...
Рейтинг: 0 / 0
Помогите с DependencyProperty
    #37091252
Фотография 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"
...
Рейтинг: 0 / 0
Помогите с DependencyProperty
    #37091253
xpoft2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LRxpoft2010,

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

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

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

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

ЗЫ: Прилагается весь проект.
...
Рейтинг: 0 / 0
Помогите с DependencyProperty
    #37091269
xpoft2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Помогите с DependencyProperty
    #37091378
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Помогите с DependencyProperty
    #37091387
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и в замеле
local:MainWindow.Test="Collapsed"
local:DepPropWindow.Test="Collapsed"
(MainWindow - в моем примерчике)
...
Рейтинг: 0 / 0
Помогите с DependencyProperty
    #37092473
xpoft2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот что еще по теме нашел на GotDotNet
http://www.gotdotnet.ru/forums/14/110081/520205/#post520205 , там в рассуждениях показано как вытащить св-во через ресурс, но в этом случае непонятно как обновлять целевое св-во забинденного объекта на этот ресурс.
...
Рейтинг: 0 / 0
Помогите с DependencyProperty
    #37092948
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
@автор
если тебе необходимо забиндиться на проперти родителя, необходимо сделать всего лишь
Код: plaintext
1.
<Button Content="Test" Visibility="{Binding Path=TestProperty}"/>
т.к. DataContext у всех контролов по умолчанию Родительский класс.
...
Рейтинг: 0 / 0
Помогите с DependencyProperty
    #37093409
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
извиняйте, не много промахнулся.
нужно конечно же биндиться на саму пропертю, а не на DependencyProperty
Код: plaintext
1.
<Button Content="Test" Visibility="{Binding Path=Test}"/>
...
Рейтинг: 0 / 0
Помогите с DependencyProperty
    #37095842
xpoft2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
уТКа@автор
если тебе необходимо забиндиться на проперти родителя, необходимо сделать всего лишь
Код: 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
25 сообщений из 26, страница 1 из 2
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Помогите с DependencyProperty
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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