Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/34: Рейтинг темы: голосов - 34, средняя оценка - 4.94
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438

Прямой биндинг к свойству класса

22.03.2016, 23:10. Показов 7295. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Тема очень заезжена, но перепробовав все предложенные гуглом варианты привязка не срабатывает..
Пишу свой контрол, в нем есть такие строки
XML
1
2
3
<UserControl x:Class="NewБукахи.Insect"
...
<Border DataContext="{Binding Source=NewБукахи.Insect, Path=s}" BorderBrush="{Binding}"
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public partial class Insect : UserControl, INotifyPropertyChanged
    {
        protected virtual void OnPropertyChanged(string propertyName = null)
        {
            var _handler = PropertyChanged;
            if (_handler != null)
                _handler(this, new PropertyChangedEventArgs(propertyName));
        }
        public Insect()
        {
            InitializeComponent();
            s = new SolidColorBrush(Colors.Red);
            OnPropertyChanged("s");
            }
        public event PropertyChangedEventHandler PropertyChanged;
        SolidColorBrush s { get; set; }
        }
почему BorderBrush не биндится к SolidColorBrush s?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.03.2016, 23:10
Ответы с готовыми решениями:

Биндинг к свойству
Мне надо прибиндиться к свойству класса, которое меняю не я (внутри класса меняется). Соответственно я не могу реализовать интерфейс...

Биндинг к статическому свойству
возможно ли прибиндиться к статическому свойству класса? xmlns:se=&quot;clr-namespace:CommonHelper.SocketsEx;assembly=CommonHelper&quot; ...

Биндинг триггера к свойству формы
Такой код: &lt;Button Content=&quot;Connect&quot; Grid.Row=&quot;1&quot; Grid.Column=&quot;9&quot; Click=&quot;btConnect_Click&quot;&gt; &lt;Button.Style&gt; &lt;Style&gt; ...

11
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
23.03.2016, 10:49
Контрол реализует INotifyPropertyChanged? Контролам это ни к чему. Декомпилируйте исходники любого их стандартных контролов, и Вы увидите, что все свойства контролов - это DependencyProperty. почитайте о том, как их создавать здесь.
INotifyPropertyChanged же реализуют вью-модели для оповещения элементов управления об изменениях свойств.

Что касается самого кода привязки:
Цитата Сообщение от Рядовой Посмотреть сообщение
XML
1
<Border DataContext="{Binding Source=NewБукахи.Insect, Path=s}" BorderBrush="{Binding}"
Правильнее было бы написать вот так:

XML
1
<Border BorderBrush="{Binding Path=s, RelativeSource={RelativeSource Ancestortype={x:Type NewБукахи.Insect}}, Mode=OneWay}" />
Но, если Вы создаёте контрол для управления данными, то Вы можете создать контрол, как это описано в здесь, и использовать привязку TemplateBinding
XML
1
<Border BorderBrush="{TemplateBinding s}" />
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
23.03.2016, 14:57  [ТС]
Цитата Сообщение от novikov.ea Посмотреть сообщение
<Border BorderBrush="{Binding Path=s, RelativeSource={RelativeSource Ancestortype={x:Type NewБукахи.Insect}}, Mode=OneWay}" />
Свойство "Ancestortype" не найдено в типе "RelativeSource".
Контрол не для данных, так что последний вариант не подошел( хотя не понятно, почему нельзя просто написать {TemplateBinding s}).
Цитата Сообщение от novikov.ea Посмотреть сообщение
все свойства контролов - это DependencyProperty
Читал, что DependencyProperty и INotifyPropertyChanged - это аналоги, только первый работает куда медленее. В моем варианте BorderBrush не изменит цвет при изменении свойства s?
0
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
23.03.2016, 15:17
Цитата Сообщение от Рядовой Посмотреть сообщение
Свойство "Ancestortype" не найдено в типе "RelativeSource".
Вы хотя бы немножко всмотритесь в представленный мной код. Я писал в блокноте, и поэтому ошибся при наборе. Букву "t" в Ancestortype нужно прописать большую - AncestorType.
Цитата Сообщение от Рядовой Посмотреть сообщение
хотя не понятно, почему нельзя просто написать {TemplateBinding s}
Потому что xaml-код в UserControl.xaml - это не ControlTemplate. А TemplateBinding применяется внутри ControlTemplate и DataTemplate.
Цитата Сообщение от Рядовой Посмотреть сообщение
Читал, что DependencyProperty и INotifyPropertyChanged - это аналоги, только первый работает куда медленее
Ну, естественно. INotifyPropertyChanged - это просто интерфейс, а DependencyProperty - это объект. Но все свойства, описанные в контролах являются DependencyProperty. Почитайте о свойствах зависимостей, чтобы понять, почему.
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
23.03.2016, 15:40  [ТС]
Цитата Сообщение от novikov.ea Посмотреть сообщение
Я писал в блокноте, и поэтому ошибся при наборе
Уж очень синтаксис байдинга в WPF не интуитивно понятный, сам не знал как правильно писать.
Теперь выдает 2 ошибки: Вложенные типы не поддерживаются NewБукахи.Insect и ссылке на тип не удается найти общий тип с именем "NewБукахи.Insect". Может что то не так пишу?
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
<UserControl x:Class="NewБукахи.Insect"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" Height="50" Width="50">
    <Grid>
        <Border BorderBrush="{Binding Path=s, RelativeSource={RelativeSource AncestorType={x:Type NewБукахи.Insect}}, Mode=OneWay}"
                BorderThickness="10" HorizontalAlignment="Left" Height="40" VerticalAlignment="Top" Width="40">
            <Image HorizontalAlignment="Center" Source="D:\\1.png"></Image>
        </Border>
    </Grid>
</UserControl>
0
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
23.03.2016, 15:46
Пространство имён тоже же надо определить, иначе программа не понимает, откуда класс Insect взялся
XML
1
xmlns:local="clr-namespace:NewБукахи;assembly=NewБукахи"
XML
1
<Border BorderBrush="{Binding Path=s, RelativeSource={RelativeSource AncestorType={x:Type local:Insect}}, Mode=OneWay}" />
1
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
23.03.2016, 16:08  [ТС]
novikov.ea, ссылке на тип не удается найти общий тип с именем "Insect"..
а если написать
XML
1
xmlns:local="clr-namespace:NewБукахи"
Компилится без ошибок, но привязки нет
0
Жуткая тВарЬ
394 / 329 / 135
Регистрация: 06.02.2015
Сообщений: 962
Записей в блоге: 1
23.03.2016, 16:44
Лучший ответ Сообщение было отмечено Рядовой как решение

Решение

Да когда же вы допрете, что надо источник указывать в виде
XML
1
{Binding s, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}
Вы конечно можете указать и вот так
XML
1
{Binding s, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:Insect}}}
Но большого смысла в этом нет, только если где то по дороге вверх по дереву не встретиться еще один UserControl

Добавлено через 1 минуту
Цитата Сообщение от Рядовой Посмотреть сообщение
DependencyProperty и INotifyPropertyChanged - это аналоги
Если это аналоги, то я испанский летчик !!!
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
23.03.2016, 18:08  [ТС]
amarf, студия ошибок не находит, но привязки все равно нет(нет красного бордера)...
Сделал свойство s через DependencyProperty, но студия ругается
Класс "NewБукахи.Insect" не может иметь несколько базовых классов: "System.Windows.Controls.UserControl " и "DependencyObject"
Надо выносить свойство s в отдельный класс?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public partial class Insect : UserControl, DependencyObject
    {
        public Insect()
        {
            InitializeComponent();
            s = new SolidColorBrush(Colors.Red);
        }
        public SolidColorBrush s
        {
            get { return (SolidColorBrush)GetValue(MyProperty); }
            set { SetValue(MyProperty, value); }
        }
        public static readonly DependencyProperty MyProperty =
        DependencyProperty.Register("s", typeof(SolidColorBrush), typeof(Insect), new UIPropertyMetadata(""));
    }
0
Жуткая тВарЬ
394 / 329 / 135
Регистрация: 06.02.2015
Сообщений: 962
Записей в блоге: 1
23.03.2016, 18:20
Цитата Сообщение от Рядовой Посмотреть сообщение
студия ошибок не находит, но привязки все равно нет(нет красного бордера)
А вы не пробывали случаем, так вот на вскидку, возМоЖНо и т.п. ...... свойство SolidColorBrush s { get; set; }
сделать PUBLIC !!!!!!!

Добавлено через 20 секунд
Когда оно было просто свойством
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
23.03.2016, 18:57  [ТС]
amarf, спасибоочень помогли)

Добавлено через 12 минут
amarf, а, как теперь правильно менять свойство s? DependencyProperty или INotifyPropertyChanged
0
Жуткая тВарЬ
394 / 329 / 135
Регистрация: 06.02.2015
Сообщений: 962
Записей в блоге: 1
24.03.2016, 08:55
Рядовой, смотря какая цель, в твоем случае просто INotifyPropertyChanged, но если нужно будет свойство менять через интерфейс, например менять цвет с помощью другого контрола, то тогда DependencyProperty, но свойства зависимости создать мало, надо его изменение еще его связать с твоим бордером
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.03.2016, 08:55
Помогаю со студенческими работами здесь

Не срабатывает биндинг к свойству в MainViewModel
Удалил всё ненужное, самые детали оставил: &lt;Application x:Class=&quot;Wpf_CareerPattern.App&quot;...

Биндинг к свойству типа double + валидация
Я использую для валидации вот такой класс: public abstract class ViewModelBase : INotifyPropertyChanged, IDataErrorInfo { ...

Из одного класса обратиться к свойству progressBar из другого класса (основного окна)
Привет! :) Помогите пожалуйста нубу (мне). У меня есть два класса. Первый (основной), его код: namespace CMS { ///...

Как обратиться из конструктора базового абстрактного класса к свойству-массиву класса наследника
Добрый день. Подскажите как обратиться из конструктора базового абстрактного класса к свойству-массиву из класса наследника. Вроде бы...

Как обратиться к свойству класса из метода этого же класса
Добрый день! function Tta_component.check: boolean; //âåðíåò true åñëè ïðè èíèöèàëèçàöèè áûëà äîïóùåíà îøèáêà var temp_result:...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
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