Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
116 / 115 / 64
Регистрация: 03.06.2013
Сообщений: 582

Привязка данных к кастомному свойству зависимости

03.10.2016, 23:51. Показов 1968. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Появился потребность передать в UserControl некую информацию, а точнее привзяать эту информацию к свойству, которое нужно для начала создать.

Собсвенно код UserControl:
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
34
35
36
37
    public partial class ComponentsComposer : UserControl
    {
        public ComponentsComposer()
        {
            InitializeComponent();
        }
 
        public List<SubjectBase> Selection
        {
            get { return (List<SubjectBase>)GetValue(SelectionProperty); }
            set { SetValue(SelectionProperty, value); }
        }
 
        public static readonly DependencyProperty SelectionProperty =
            DependencyProperty.Register("SelectionProperty", typeof(List<SubjectBase>),
                typeof(ComponentsComposer),
                new UIPropertyMetadata(default(List<SubjectBase>),new PropertyChangedCallback(SelectionPropertyChanged)));
 
        private static void SelectionPropertyChanged(DependencyObject depObj, DependencyPropertyChangedEventArgs depArgs)
        {
            ComponentsComposer tmp = (ComponentsComposer)depObj;
            List<SubjectBase> newValue = (List<SubjectBase>)depArgs.NewValue;
 
            string dictionaryUri = string.Format("/Resources/Styles/Buttons.xaml");
 
            ResourceDictionary resDict = new ResourceDictionary();
            resDict.Source = new Uri(dictionaryUri, UriKind.Relative);
 
            foreach (SubjectBase value in newValue)
            {
                Button bt = new Button();
                bt.Style = (Style)resDict["RemoveLabeltyle"];
                tmp.wpMain.Children.Add(bt);
            }
        }
    }
}

Теперь, я в главном окне пытаюсь привязать это свойство:
XML
1
   <controls:ComponentsComposer Selection="{Binding Supplements}"/>
На что получаю такое исключение:

An exception of type 'System.Windows.Markup.XamlParseExceptio n' occurred in PresentationFramework.dll but was not handled in user code
Additional information: "Binding" нельзя задать в свойстве "Selection" типа "ComponentsComposer". "Binding" можно задать только в параметре DependencyProperty объекта DependencyObject.


Первый раз столкнулся с созданием свойства зависимости, может я что то упустил?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.10.2016, 23:51
Ответы с готовыми решениями:

Привязка данных к изменямому в кодк свойству
Доброго дня! Столкнулась с проблемой привязки TextBox.Text или TextBlock.Text к свойству изменяемому в коде. Для того, чтобы...

Привязка к свойству класса
Приветствую, ребята! Подскажите пожалуйста, как сделать привязку элемента к свойству класса? Т.е. есть некий класс (ViewModel), в нем есть...

Привязка цвета к свойству
Есть класс PointData со свойством OnOff(отвечающий за цвет точки) если оно true; тогда свойство OnOffColor =...

4
.NET senior
 Аватар для bax_tang
441 / 359 / 137
Регистрация: 23.09.2016
Сообщений: 980
04.10.2016, 06:53
MaxSlim, попробуйте в этом куске кода
C#
1
2
3
4
5
6
public static readonly DependencyProperty SelectionProperty =             
DependencyProperty.Register("SelectionProperty", 
    typeof(List<SubjectBase>),                
    typeof(ComponentsComposer),                 
    new UIPropertyMetadata(default(List<SubjectBase>),
    new PropertyChangedCallback(SelectionPropertyChanged)));
изменить имя свойства на Selection (то есть на то, к которому хотите сделать привязку).

Добавлено через 3 минуты
То есть должно получиться что-то типа
C#
1
2
3
DependencyProperty.Register("Selection",   
    typeof(List<SubjectBase>),                    
    typeof(ComponentsComposer), ...);
1
116 / 115 / 64
Регистрация: 03.06.2013
Сообщений: 582
04.10.2016, 22:09  [ТС]
У меня появилась новая пролема, свойство зависимости обновляется только один раз, при установке биндинга! Переделал свойство так:
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
public ObservableCollection<SubjectBase> Selection
        {
            get { return (ObservableCollection<SubjectBase>)GetValue(SelectionProperty); }
            set { SetValue(SelectionProperty, value); }
        }
 
        public static readonly DependencyProperty SelectionProperty =
            DependencyProperty.Register("Selection", 
                typeof(ObservableCollection<SubjectBase>),
                typeof(ComponentsComposer),
                new FrameworkPropertyMetadata(default(ObservableCollection<SubjectBase>),FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
                    new PropertyChangedCallback(SelectionPropertyChanged)));
 
        private static void SelectionPropertyChanged(DependencyObject depObj, DependencyPropertyChangedEventArgs depArgs)
        {
            ComponentsComposer tmp = (ComponentsComposer)depObj;
            ObservableCollection<SubjectBase> newValue = (ObservableCollection<SubjectBase>)depArgs.NewValue;
 
            string dictionaryUri = string.Format("/Resources/Styles/Buttons.xaml");
 
            ResourceDictionary resDict = new ResourceDictionary();
            resDict.Source = new Uri(dictionaryUri, UriKind.Relative);
 
            tmp.wpMain.Children.Clear();
            foreach (SubjectBase value in newValue)
            {
                Button bt = new Button();
                bt.Style = (Style)resDict["RemoveLabeltyle"];
                bt.Content = value.GetDescripton();
                tmp.wpMain.Children.Add(bt);
            }
        }
Теперь привязка работает, с этим свойством:
C#
1
2
private static Pizza Pizza = new Pizza(PizzaSize.Large);
public static ObservableCollection<SubjectBase> Selection { get; set; } = new ObservableCollection<SubjectBase>() { Pizza };
В коде есть метод, который добавляет к коллекции элементы, но почему то моё свойство зависимости этого не видит.(

Добавлено через 7 часов 35 минут
Акутально! Кто не понял, проблема такова: не получается создать привязку с кастомным свойством зависимости. Код сверху, подскажите, что не так.
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
05.10.2016, 00:04
Цитата Сообщение от MaxSlim Посмотреть сообщение
В коде есть метод, который добавляет к коллекции элементы, но почему то моё свойство зависимости этого не видит.(
SelectionProperty содержит всего лишь ссылку на коллекцию.
При добавлении элементов в коллекцию ссылка естественно остается та же, поэтому вызов SelectionPropertyChanged не происходит.
Вы правильно сделали, что начали копать в сторону использования ObservableCollection<T>, т.к. этот тип содержит событие CollectionChanged, которое нотифицирует об изменении списка элементов коллекции.
Вам осталось доделать подписку/отписку на событие.

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
private static void SelectionPropertyChanged(DependencyObject depObj, DependencyPropertyChangedEventArgs depArgs)
{
    ComponentsComposer tmp = (ComponentsComposer)depObj;
 
    NotifyCollectionChangedEventHandler collectionChangedHandler = (o, e) => { ProcessSelectionChanged(tmp); }; //lambda closure (лямбда замыкание) в данном случае единственный способ передать ссылку на ComponentsComposer в функцию обработки события CollectionChanged
 
    ObservableCollection<SubjectBase> oldValue = depArgs.OldValue as ObservableCollection<SubjectBase>; // использование оператора 'as' в данном случае безопаснее, т.к. DependencyProperty может содержать значение DependencyProperty.UnsetValue. При использовании direct cast в таком случае произойдет InvalidCastException
    if (oldValue != null)
    {
        oldValue.CollectionChanged -= collectionChangedHandler; // обязательно отписываемся от старой коллекции!!!. Да, отписка от анонимного делегата должна работать.
    }
    ObservableCollection<SubjectBase> newValue = depArgs.NewValue as ObservableCollection<SubjectBase>;
    if (newValue != null)
    {
        newValue.CollectionCHanged += collectionChangedHandler;
    }
 
    ProcessSelectionChanged(tmp); // не забываем, что при биндинге тоже нужно обработать коллекцию
}
 
private static void ProcessSelectionChanged(ComponentsComposer c)
{
      ComponentsComposer c;
      ObservableCollection<SubjectBase> selection = c.Selection;
      
      // TODO: здесь должна быть логика обработки коллекции
}
1
116 / 115 / 64
Регистрация: 03.06.2013
Сообщений: 582
05.10.2016, 08:37  [ТС]
nicolas2008, спасибо, попробую.

Добавлено через 27 минут
nicolas2008, очень странное дело, у меня теперь вообще не обновляет свойство.

Добавлено через 8 минут
nicolas2008, прошу прощение, откатился, всё окей. Проблема решена.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.10.2016, 08:37
Помогаю со студенческими работами здесь

GridViewColumn привязка к свойству Width другого элемента
Всем привет! Не могу разобраться с ListView. У меня 2 проблемы: 1. Не работает привязка свойства Width элемента GridViewColumn к...

Привязка TextBox.Text и DataGrid.SelectedItem к одному свойству
Добрый вечер! Про DataGrid много создано тем, но найти решение возникшей проблемы не удалось (может быть плохо искала). Есть...

Ошибка: привязка к свойству или столбцу невозможна
Здравствуйте, нужна помощь. При попытке передать данные из datagridview (1 форма) в textbox (другая форма) выскакивает ошибка: Привязка к...

"Привязка к свойству или столбцу DataSource невозможна"
Доброго времени суток, начал изучать C#, создал БД &quot;Phone&quot;, написал клиент. Создал подключение к БД (Microsoft Access), Источник данных:...

Фильтрация по кастомному аттрибуту (отношению ) Laravel
Есть модели Driver и DriverType. У водителя может быть множество типов, но текущий тип всегда один (последний). Driver (id, name, age) ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru