Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/22: Рейтинг темы: голосов - 22, средняя оценка - 4.59
1 / 1 / 0
Регистрация: 31.03.2013
Сообщений: 69
1
.NET 4.x

DependencyProperty + Binding в WPF

10.06.2013, 16:07. Показов 4280. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.

Решил попробовать поработать со свойствами зависимостей и наткнулся на ткую штуку - не понимаю как их заставить работать.

У меня есть класс, внутри которого ссылки на другие классы, а в них находятся (теоретически) свойства зависимостей, которые должны хранить в себе строки.
Как-то так:
C#
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
public class CameraLocalization : UserControl
    {
        public CameraLocalization()
        {
            headers = new CameraHeaders();
            toolTips = new CameraToolTips();
            SetLocal();
            //SetEnLocal();
        }
        
        private Language lang = SettingsManager.Language.ru_RU;
        private CameraHeaders headers;
        private CameraToolTips toolTips;
 
        public Language Lang
        {
            get { return lang; }
            set
            {
                lang = value;
                SetLocal(); 
                //RaisePropertyChanged();
            }
        }
 
        public static readonly DependencyProperty HeadersProperty =
            DependencyProperty.Register("Headers", typeof(CameraHeaders), typeof(CameraLocalization), new PropertyMetadata(default(CameraHeaders)));
 
        public CameraHeaders Headers
        {
            get { return (CameraHeaders)GetValue(HeadersProperty); }
            set { SetValue(HeadersProperty, value); }
        }
Но вот тут возникает вопрос, как собственно и куда записывать эти значения?
Раньше я делал так:
C#
1
2
3
4
5
private void SetRuHeaders()
        {
            headers.PositionGroupHeader = ru_RU.CameraPositionGroupHeader;
            headers.ViewDirectionGroupHeader = ru_RU.CameraViewDirectionGroupHeader;
}
а сейчас если я сделаю
C#
1
2
3
4
private void SetRuHeaders()
        {
            Headers.PositionGroupHeader = ru_RU.CameraPositionGroupHeader;
            Headers.ViewDirectionGroupHeader = ru_RU.CameraViewDirectionGroupHeader;}
То получу ошибку ещё на этапе создания класса.
В свойстве подкласса я тоже сделал свойство зависимостей:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class CameraHeaders: UserControl
    {
        public CameraHeaders()
        {
            this.DataContext = this;
        }
public static readonly DependencyProperty SectionManagementProperty =
            DependencyProperty.Register("SectionManagement", typeof(String), typeof(CameraHeaders), new FrameworkPropertyMetadata(default(String)));
 
        public String SectionManagement
        {
            get { return (String) GetValue(SectionManagementProperty); }
            set { SetValue(SectionManagementProperty, value); }
        }
}
Ну и в XAML я сделал
XML
1
<GroupBox Header="{Binding ElementName=Localization, Path=Headers.PositionGroupHeader, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}">
Только в итоге у меня вообще ничего не отображается, что в общем-то ожидаемо, потому что я что-то сделал не так, а вот что - не пойму. Если делать обычные свойства, тогда строки отображаются, но не обновляются на UI при их изменении, а со свойствами зависимостей вообще не работает ничего. Кто мне подскажет, что я сделал не так?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.06.2013, 16:07
Ответы с готовыми решениями:

Не работает Binding для DependencyProperty
Вот тут не работает привязка: &lt;da:MyShort Value=&quot;{Binding Path=subId}&quot; /&gt; public class...

WPF MVVM. DependencyProperty не доступен в собственном xaml
Форумчане привет! Вот создаю я в код бихайнде свойство зависимости (любого типа): public...

WPF MVVM View и ViewModel или UserControl и DependencyProperty
Не так давно ударился в WPF и шаблон MVVM. Вот такой вопрос возник... У меня есть View которая...

"Binding" можно задать только в параметре DependencyProperty объекта DependencyObject."
Всем привет как можно обойти это исключение пытаюсь привязать CredentialsProvider он в находится в...

12
155 / 155 / 30
Регистрация: 19.10.2009
Сообщений: 319
11.06.2013, 06:59 2
А что и где должно отображаться - здесь не приведено строк, которые что-то отображали б. Если их не сделать, то, конечно, не будет. Есть два варианта, один, возможно, чем-то и проще, если уж используется UserControl:
C#
1
2
3
4
5
6
7
8
9
public static readonly DependencyProperty SectionManagementProperty =
            DependencyProperty.Register("SectionManagement", typeof(String), typeof(CameraHeaders), new FrameworkPropertyMetadata(default(String), OnSectionManagementChanged));
 
 
private static void OnSectionManagementChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    CameraHeaders ch = (CameraHeaders)d;
    ch./*...*/ = e.NewValue as string;
}
Хотя, я б сделал так:
XML
1
2
3
4
5
6
7
8
9
<Control xmlns...>
<Control.Template>
<ControlTemplate>
<!-- ... -->
<TextBlock Text="{TemplateBinding SectionManagement}"/>
<!-- ... -->
</ControlTemplate>
</Control.Template>
</Control>
Т. е. наследование от Control, а не UserControl.
0
1 / 1 / 0
Регистрация: 31.03.2013
Сообщений: 69
11.06.2013, 14:45  [ТС] 3
Разобрался почему ичего не апдейтлось - оказалось, что я юзал разные экземпляры класса в каждом отдельно взятом XAML. Теперь у меня возник резонный вопрос - как сделать, чтобы из разных страниц можно было достучаться до одного и того же экземпляра класса, чтобы XAML не создавал кучу экземпляров одного и того же.
0
176 / 93 / 10
Регистрация: 27.05.2013
Сообщений: 290
11.06.2013, 15:54 4
Используй Resources программы
0
1 / 1 / 0
Регистрация: 31.03.2013
Сообщений: 69
11.06.2013, 16:29  [ТС] 5
Dexiny,
А можно подробнее?
0
176 / 93 / 10
Регистрация: 27.05.2013
Сообщений: 290
11.06.2013, 16:40 6
Тебе что именно надо сделать общим? Если XAML-объекты, то в файлике App.xaml добавь ресурсы или словари ресурсов. Если что-то другое - Свойства проекта - Resources
0
1 / 1 / 0
Регистрация: 31.03.2013
Сообщений: 69
11.06.2013, 16:57  [ТС] 7
Мне нужно каким-то образом сделать класс Localization общим для всех страниц, которые к нему обращаются. Я его наследую от userControl и подключаю, как указал выше. Так вот каждый раз при обращении к странице, создаётся новый экземпляр этого класса, а мне нужно, чтобы они обращались всегда к одному и тому же и чтобы при этом я не потерял возможность биндиться через elementName на свойства этого класса.
0
176 / 93 / 10
Регистрация: 27.05.2013
Сообщений: 290
11.06.2013, 18:43 8
пропиши объект в ресурсы и бинди на ресурс
0
1 / 1 / 0
Регистрация: 31.03.2013
Сообщений: 69
11.06.2013, 19:15  [ТС] 9
Если я так сделаю, я потеряю возможность биндиться к свойствам объекта. Можно будет просто сделать "{Binding StaticResource ...}" Или я не прав. Если не прав, то можно пример?
0
176 / 93 / 10
Регистрация: 27.05.2013
Сообщений: 290
11.06.2013, 19:35 10
Лучший ответ Сообщение было отмечено Ev_Hyper как решение

Решение

лови
Вложения
Тип файла: zip WpfExternBinding.zip (60.4 Кб, 58 просмотров)
2
1 / 1 / 0
Регистрация: 31.03.2013
Сообщений: 69
11.06.2013, 19:42  [ТС] 11
Супер, всё работает, только у меня ещё один вопрос.

Если мне нужно в codebehind изменить какое-то свойство внутри этого класса, то получается, что я уже не попаду на тот же его экземпляр, который был создан в ресурсах. Как мне быть в таком случае? Или может быть есть возможность как-то выцепить текущий экземляр?
0
176 / 93 / 10
Регистрация: 27.05.2013
Сообщений: 290
11.06.2013, 19:46 12
Для моего кода, обращение к ресурсу (ну и изменить его можно)
C#
1
var res = App.Current.Resources["cveta"] as Palitra;
0
1 / 1 / 0
Регистрация: 31.03.2013
Сообщений: 69
11.06.2013, 19:52  [ТС] 13
Это гениально! Всё работает, как я хотел. Спасибо огромное за помощь.
0
11.06.2013, 19:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.06.2013, 19:52
Помогаю со студенческими работами здесь

Binding wpf
Здравствуйте. Подскажите пожалуйста, как можно связать строковую переменную и значение текста в...

[WPF] Binding ElementName
Добрый день. Кнопка за биндина на значение слайдера. Проблема: если значение слайдера равно 0...

WPF+Binding+IPropertyChange
Есть следующий код: public class Node : INotifyPropertyChanged { private string _data;...

WPF DataGrid Binding
Доброго времени суток, товарищи. Работаю с DataGrid и появилась необходимость ввести поиск по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru