powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Привязка DP-свойства UserControl к вложенному элементу
13 сообщений из 38, страница 2 из 2
Привязка DP-свойства UserControl к вложенному элементу
    #39801025
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proвроде бы нетА "перехватывать" назначение привязки?
Чтобы назначать с нужным режимом?
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39801026
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld HaspShocker.Proвроде бы нетА "перехватывать" назначение привязки?
Чтобы назначать с нужным режимом?Все расширенные настройки для свойства зависимости назначаются через FrameworkPropertyMetadata - посмотри, что в нем вообще есть в конструкторах и свойствах
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39801029
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld Hasp
Код: xml
1.
2.
        <local:DPCalculatorUC DataContext="{Binding VMfromUC, Mode=OneWay}" 
                              Result="{Binding ResultMain, Mode=OneWayToSource, Source={StaticResource VM}}" />

Всё-таки ужасный паттерн, и жаль читателей твоего блога, которые попытаются взять его на вооружение.

По большому счету тут должна быть просто CalculatorVM, шаблон для него и ContentPresenter и никаких юзерконтролов
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39801033
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProEld Hasp
Код: xml
1.
2.
        <local:DPCalculatorUC DataContext="{Binding VMfromUC, Mode=OneWay}" 
                              Result="{Binding ResultMain, Mode=OneWayToSource, Source={StaticResource VM}}" />

Всё-таки ужасный паттерн, и жаль читателей твоего блога, которые попытаются взять его на вооружение.

По большому счету тут должна быть просто CalculatorVM, шаблон для него и ContentPresenter и никаких юзерконтролов
Ну, такая же привязка (Mode=OneWayToSource) очень редко используется. Тем более "прокидывание" связи от вложенной VM в основную VM через UC.
Это больше демонстрация возможности.

Основное использование это таким образом.
Код: xml
1.
2.
3.
4.
5.
6.
7.
    <StackPanel>
        <TextBlock Margin="10">
            <Run Text="Результат вычисления:"/>
            <Run Text="{Binding Result, ElementName=dPCalculatorUC, Mode=OneWay}"/>
        </TextBlock>
        <local:DPCalculatorUC x:Name="dPCalculatorUC" DataContext="{Binding VMfromUC, Mode=OneWay}"/>
    </StackPanel>



Просто когда делаешь пример, хочется учесть и различные другие способы использования, пусть и не совсем стандартные.

Почему именно через UC, а не шаблон? Вопросов в разделе, где будет тема, больше именно по использованию UC.
Для себя лично, я по-моему, ещё ни разу не использовал UC в своих реальных решения. Изначально взял ориентир на максимальное использование шаблонов и стилей (в том числе и чтобы их лучше изучить) и пока их возможностей хватает.
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39801034
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProEld Haspпропущено...
А "перехватывать" назначение привязки?
Чтобы назначать с нужным режимом?Все расширенные настройки для свойства зависимости назначаются через FrameworkPropertyMetadata - посмотри, что в нем вообще есть в конструкторах и свойствахСмотрел в первую очередь.
Есть различные обратные вызовы при изменении значения. Но ни каких при установки привязки.
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39801354
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UserControl'ы не использую в 99% случаев
Для создания элементов управления использую наследование от Control'а
А для вёрстки использую DataTemplate'ы
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
<Application x:Class="ControlExample.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:ControlExample"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ControlTemplate x:Key="MyControlDefaultTemplate" TargetType="{x:Type local:MyControl}">
            <Border Background="{TemplateBinding Background}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}">
                <TextBlock Text="{TemplateBinding MyDependencyProperty}" 
                           HorizontalAlignment="Center" VerticalAlignment="Center"/>
            </Border>
        </ControlTemplate>
        
        <Style TargetType="{x:Type local:MyControl}">
            <Setter Property="Background" Value="White"/>
            <Setter Property="BorderBrush" Value="Black"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="Template" Value="{ StaticResource MyControlDefaultTemplate}"/>
        </Style>
    </Application.Resources>
</Application>


Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<Window x:Class="ControlExample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ControlExample"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <local:MyControl MyDependencyProperty="My Value" Margin="5"/>
    </Grid>
</Window>


Код: 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.
using System.Windows;
using System.Windows.Controls;

namespace ControlExample
{
    public class MyControl : Control
    {
        static MyControl()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(MyControl), 
                new FrameworkPropertyMetadata(typeof(MyControl)));
        }

        public static readonly DependencyProperty MyDependencyPropertyProperty =
            DependencyProperty.Register(nameof(MyDependencyProperty), typeof(string), typeof(MyControl), 
                new PropertyMetadata(default(string)));

        public string MyDependencyProperty
        {
            get => (string)GetValue(MyDependencyPropertyProperty);
            set => SetValue(MyDependencyPropertyProperty, value);
        }
    }
}
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39801366
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Роман, а в каком случае (1%) ты используешь Юзерконтролы?

Твой вариант меня лично смущает только одним - дефолтный шаблон не инкапсулирован с самим контролом - соответственно его сложнее таскать между проектами
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39801374
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

ну в реальной жизни, он бы хранился в Generic.xaml, это же пример
на счет 1% даже не знаю, я просто не максималист, по этому если 100% использую, то буду считать, что это 99% :D
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39801396
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesну в реальной жизни, он бы хранился в Generic.xaml, это же примерну так все равно при выносе в либу или в другой проект пришлось бы перетаскивать и назначение шаблона
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39801409
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProRoman Mejtesну в реальной жизни, он бы хранился в Generic.xaml, это же примерну так все равно при выносе в либу или в другой проект пришлось бы перетаскивать и назначение шаблона
нет, почему?
в Generic.xaml есть стиль, по умолчанию, он будет подключаться и в нём задан шаблон по умолчанию.
Если всё это сделать в отдельной сборке, никаких манипуляций не нужно, подключаете сборку и используете, всё просто и удобно.
Так как это дефолтный стиль, то переопределенный стиля будет автоматически унаследован от него.
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39801541
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman MejtesUserControl'ы не использую в 99% случаев
Для создания элементов управления использую наследование от Control'а
А для вёрстки использую DataTemplate'ы
Да, согласен.
Я уже писал Shocker.Pro, что сам я так не делаю, но пытаюсь разъяснит начинающим (ещё более чем я) различные способы использования UC. Так как различные вопросы про взаимодействие с UC очень часты.

Roman Mejtes, может Вы внесёте ясность как правильно сделать DP свойство только для чтения, но с возможностью сделать в нём привязку (Mode=OneWayToSource)? Или такое в принципе невозможно?
Просто иногда сталкиваешься в конструкторе с тем что выбор различных режимов (Mode) для привязки ограничен. Можно ли явно такое ограничение прописывать? Или при выборе любого режима устанавливать всё равно только допустимый?
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39801580
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То, что вы хотите сделать невозможно.
Невозможно создать связывание со свойством зависимости только для чтения
Вот ответ, на ваш вопрос:
https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Data/BindingExpression.cs,8f8a18ec6ff7f298
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
internal static BindingExpression CreateBindingExpression(DependencyObject d,
                                                DependencyProperty dp,
                                                Binding binding,
                                                BindingExpressionBase parent)
        {
            FrameworkPropertyMetadata fwMetaData = dp.GetMetadata(d.DependencyObjectType) as FrameworkPropertyMetadata;
 
            if ((fwMetaData != null && !fwMetaData.IsDataBindingAllowed) || dp.ReadOnly)
                throw new ArgumentException(SR.Get(SRID.PropertyNotBindable, dp.Name), "dp");



По умолчанию задать для свойства зависимости OneWayToSource невозможно, только TwoWay.
Свойства зависимости только для чтения нужны не для связывания, а для триггеров, анимации, менеджера состояний и прочих плюшек представления.
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39801599
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman MejtesСвойства зависимости только для чтения нужны не для связывания, а для триггеров, анимации, менеджера состояний и прочих плюшек представления.
Я так и понял.
Но думал может есть какие обходные, нестандартные способы.

Мне пришлось сделать обычное свойство и программно контролировать чтобы извне оно не менялось.
...
Рейтинг: 0 / 0
13 сообщений из 38, страница 2 из 2
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Привязка DP-свойства UserControl к вложенному элементу
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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