powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Привязка DP-свойства UserControl к вложенному элементу
25 сообщений из 38, страница 1 из 2
Привязка DP-свойства UserControl к вложенному элементу
    #39800923
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотел реализовать одну задачу (в учебно-обучающих целях). Для реализации потребовалось создать привязку DP-свойства UserControl ко вложенному элементу.
До этого привязывал вложенный элемент к свойству UC - проблем не было. В данном случае привязка в элементе используется для другой зависимости (для связи с VM). Поэтому привязку надо создать у свойства UC.
И тут я "впал в ступор". Как раньше делал не получается. В XAML это свойство на уровне UC не видно. Делаю привязку в коде - не работает.
Чего-то не догоняю.

Ниже пример. В целом внутри UC хочу (если такое возможно) сделать такую цепочку привязок.
VM -> свойство UI элемента -> DP свойство UC.

Привязку надо сделать от свойства Result UC к свойству TextBox.Text элемента "tbResult".
В CB UC моя попытка (не рабочая) программного создания привязки.

XAML
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
<UserControl x:Class="ConnectionViewWithUC.DPCalculatorUC"
             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" 
             xmlns:local="clr-namespace:ConnectionViewWithUC"
             mc:Ignorable="d" d:DataContext="{x:Type local:ICalculator}" >
    <StackPanel Orientation="Horizontal">
        <TextBox VerticalAlignment="Center" 
                 Text="{Binding First, UpdateSourceTrigger=PropertyChanged}"
                 Margin="5" MinWidth="80"/>
        <ComboBox VerticalAlignment="Center"
                  ItemsSource="{Binding Operators}"
                  SelectedItem="{Binding SelectOperator}"
                  Margin="5" MinWidth="80"/>
        <TextBox Grid.Column="2" VerticalAlignment="Center" 
                 Text="{Binding Second, UpdateSourceTrigger=PropertyChanged}"
                 Margin="5"  MinWidth="80"/>
        <TextBlock Margin="5" VerticalAlignment="Center" Text="="/>
        <TextBox x:Name="tbResult" VerticalAlignment="Center" 
                 Text="{Binding Result, Mode=OneWay}" 
                 Margin="5" IsReadOnly="True" MinWidth="80"/>
    </StackPanel>
</UserControl>



CB
Код: 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.
namespace ConnectionViewWithUC
{
    /// <summary>
    /// Логика взаимодействия для DPCalculatorUC.xaml
    /// </summary>
    public partial class DPCalculatorUC : UserControl
    {
        public DPCalculatorUC()
        {
            InitializeComponent();
            Binding bind = new Binding();
            bind.Source = tbResult;
            bind.Path = new PropertyPath("Text");
            bind.Mode = BindingMode.TwoWay;
            SetBinding(ResultProperty, bind);
        }
 
 
 
        public int? Result
        {
            get { return (int?)GetValue(ResultProperty); }
            set { SetValue(ResultProperty, value); }
        }
 
        // Using a DependencyProperty as the backing store for Result.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ResultProperty =
            DependencyProperty.Register("Result", typeof(int?), typeof(DPCalculatorUC), new PropertyMetadata(null));
 
    }
}



На всякий случай, если понадобится интерфейс и его реализация
Интерфейс ICalculator
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
namespace ConnectionViewWithUC
{
    public interface ICalculator
    {
        int First {  get;set; }
        int Second {  get;set; }
        OperatorsEnum SelectOperator {  get;set; }
        int? Result { get; }
        IEnumerable<OperatorsEnum> Operators { get; }
    }
    /// <summary>Перечисление допустимых  операторов</summary>
    public enum OperatorsEnum { Сложение, Умножение, Вычитание, Деление };
}

Его реализация
Код: 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.
namespace ConnectionViewWithUC
{
    /// <summary>Класс вложенной VM для UC</summary>
    public class VMNestedVM : OnPropertyChangedClass, ICalculator
    {
        private int _first;
        private int _second;
        private OperatorsEnum _selectOperator;
        private int? _result;
        public static IEnumerable<OperatorsEnum> s_operators
            = Enum.GetValues(typeof(OperatorsEnum)).Cast<OperatorsEnum>();
 
 
        public int First { get => _first; set { _first = value; OnPropertyChanged(); OnResult(); } }
        public int Second { get => _second; set { _second = value; OnPropertyChanged(); OnResult(); } }
        public OperatorsEnum SelectOperator { get => _selectOperator; set { _selectOperator = value; OnPropertyChanged(); OnResult(); } }
        public int? Result { get => _result; set { _result = value; OnPropertyChanged(); } }
        public IEnumerable<OperatorsEnum> Operators => s_operators;
 
        /// <summary>Обработка полученных данных</summary>
        private void OnResult()
        {
            int? value = null;
            if (_selectOperator != OperatorsEnum.Деление || _second != 0)
                switch (_selectOperator)
                {
                    case OperatorsEnum.Сложение: value = _first + _second; break;
                    case OperatorsEnum.Умножение: value = _first * _second; break;
                    case OperatorsEnum.Вычитание: value = _first - _second; break;
                    case OperatorsEnum.Деление: value = _first / _second; break;
                }
            Result = value;
        }
     }
}



Также если понадобится основное окно и VM
Основное окно
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
<Window x:Class="ConnectionViewWithUC.DPMainView"
        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:ConnectionViewWithUC"
        SizeToContent="WidthAndHeight"
        mc:Ignorable="d" d:DataContext="{x:Type local:DPParentVM}" FontSize="18"
        Title="DPMainView (взаимодействие через DP свойство)">
    <Window.Resources>
        <local:DPParentVM x:Key="VM"/>
    </Window.Resources>
    <Window.DataContext>
        <Binding Mode="OneWay" Source="{StaticResource VM}"/>
    </Window.DataContext>
    <StackPanel>
        <TextBlock Margin="10">
            <Run Text="Результат вычисления:"/>
            <Run Text="{Binding ResultMain}"/>
        </TextBlock>
        <local:DPCalculatorUC DataContext="{Binding VMfromUC, Mode=OneWay}" Result="{Binding ResultMain, Source={StaticResource VM}}"/>
    </StackPanel>
</Window>


Основная (родительская) VM
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
namespace ConnectionViewWithUC
{
    /// <summary>Класс родительской VM для View целиком</summary>
    public class DPParentVM : OnPropertyChangedClass
    {
        private int? _resultMain;
 
        /// <summary>Вложенная VM для UC</summary>
        public VMNestedVM VMfromUC { get; } = new VMNestedVM();
 
        public int? ResultMain { get => _resultMain; set { _resultMain = value; OnPropertyChanged(); } }
 
    }
}



Также прилагаю архив проекта
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39800926
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Желание само по себе странное и кривое.

Но если в учебных целях - скажи, как ты проверяешь в проекте, что установленный байндинг не работает (что нажимать и куда смотреть), я посмотрю почему.
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39800934
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProЖелание само по себе странное и кривое.
Но если в учебных целях - скажи, как ты проверяешь в проекте, что установленный байндинг не работает (что нажимать и куда смотреть), я посмотрю почему.
Цель показать разные способы передачи данных между UC и View и их плюсы и минусы.

То что не работает именно привязка, проверял в дебаге. При изменени tbResult.Text в сеттер свойства UC.Result нет вхождения.

В целом по реализации при изменении tbResult.Text по привязке должно изменится UC.Result, а к нему привязанное в View свойство VM.ResultMain, к которому привязан TextBlock в View, который и должен отобразить результат.

Общая цепочка привязок такая: "VM UC (VM.VMfromUC) свойство Result" <- "UC tbResult.Text" <- "UC DP-свойство Result" = "View DPCalculatorUC.Result" -> "VM View свойство ResultMain" <- "View TextBlock Run.Text".

В VM (VM.VMfromUC) самого UC всё привязано и работает как задумывалось. Нет привязки именно между UC.Result и tbResult.Text.

То что с этим проблемы, я сразу понял когда попытался сделать привязку в XAML.
В XAML на уровне UC его свойства Result не видно. Может я его неправильно объявляю?

Но вложенные элементы без проблем привязываются к этому свойству. Допустим такая привязка работает нормально
Код: xml
1.
2.
3.
        <TextBox x:Name="tbResult" VerticalAlignment="Center" 
                 Text="{Binding Result, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:DPCalculatorUC}}}" 
                 Margin="5" IsReadOnly="True" MinWidth="80" />

Но тогда я не знаю как сделать привязку этого же свойства к UC.DataContext.Result


P.S. Что касается кривости.
У меня пока реализовано ещё два примера связи на уровне Модели и на уровне VM. Хотел показать на уровне View через DP свойство. И споткнулся.
Если можете опишите, возможные решения для подобной задачи и их + и -.
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39800938
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld Haspв сеттер свойства UC.Result нет вхождения.для начала. В сеттер вхождения НЕ БУДЕТ в любом случае. Привязка для свойств зависимости работает через DependencyObject.SetValue - надо это четко знать.

В принципе - геттер и сеттер для свойства зависимости можно ВООБЩЕ НЕ СОЗДАВАТЬ, это делается только для удобства программиста
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39800941
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld Hasp P.S. Что касается кривости.
У меня пока реализовано ещё два примера связи на уровне Модели и на уровне VM. Хотел показать на уровне View через DP свойство. И споткнулся.
Если можете опишите, возможные решения для подобной задачи и их + и -.Идеологически.
Юзерконтрол не должен работать в контексте некоей внешней VM (внешнего датаконтекста). Это должен быть автономный модуль, который получает все данные для своей работы через свойства зависимости, определенные на уровне юзерконтрола. Внутри он может использовать свою вьюмодельку, но я, в конце-концов, отказался от такого подхода - он только запутывает, необходимые поля задаются либо напрямую через codebehind, либо через RelativeSource UserControl.

А вот такое:Eld HaspОбщая цепочка привязок такая: "VM UC (VM.VMfromUC) свойство Result" <- "UC tbResult.Text" <- "UC DP-свойство Result" = "View DPCalculatorUC.Result" -> "VM View свойство ResultMain" <- "View TextBlock Run.Text".это слишком суровая жесть, ты и сам в ней разобраться не можешь. Такие цепочки - зло для масштабирования и отладки. Делай всё как можно проще.
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39800942
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld Haspа к нему привязанное в View свойство VM.ResultMain, к которому привязан TextBlock в View, который и должен отобразить результат.Еще раз. Расскажи мне как пользователю - я запустил твой проект - какие кнопки я должен нажать и где должен увидеть результат и какой. Делать реверс-инжиниринг всего твоего кода и проецировать на невнятное описание на форуме у меня желания нет, но можно посмотреть конкретную проблему.
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39800946
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProEld Haspв сеттер свойства UC.Result нет вхождения.для начала. В сеттер вхождения НЕ БУДЕТ в любом случае. Привязка для свойств зависимости работает через DependencyObject.SetValue - надо это четко знать.

В принципе - геттер и сеттер для свойства зависимости можно ВООБЩЕ НЕ СОЗДАВАТЬ, это делается только для удобства программистаВот это не до понял....
Вернее, вроде читал и понял, но на практике как оказалось - туплю...

Как можно проверить работу привязки?
В "Динамическом обозревателе свойств" в свойстве DPCalculatorUC.Result BindingExpression, но вычисленное значение 0.
Может я не правильно программно задаю привязку?
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39800947
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld HaspКак можно проверить работу привязки?Если хочется поставить точку останова, то добавь PropertyChangedCallback в объявление свойства
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39800948
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProEld Haspа к нему привязанное в View свойство VM.ResultMain, к которому привязан TextBlock в View, который и должен отобразить результат.Еще раз. Расскажи мне как пользователю - я запустил твой проект - какие кнопки я должен нажать и где должен увидеть результат и какой. Делать реверс-инжиниринг всего твоего кода и проецировать на невнятное описание на форуме у меня желания нет, но можно посмотреть конкретную проблему.
В первом окне выбирается двойным кликом пример.
В данном случае это последний "Взаимодействие по схеме: DP свойство UserControl -> "родительская VM"

После запуска примера два маленькое окошко.
UC - это два TextBox для ввода операндов, ComboBox для выбора оператора и после знака равенства TextBох для результата.

Над этим UC один TextBox из самого окна с текстом "Результат вычисления:" после него должен выводится тот же результат, что и в TextBox для результата в UC.

Визуально этот пример работает полностью идентично двум верхним: "Взаимодействие по схеме: "вложенная VM" -> Model -> "родительская VM" и "Взаимодействие по схеме: "вложенная VM" -> "родительская VM"
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39800949
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProЮзерконтрол не должен работать в контексте некоей внешней VM (внешнего датаконтекста). Это должен быть автономный модуль, который получает все данные для своей работы через свойства зависимости, определенные на уровне юзерконтрола. Внутри он может использовать свою вьюмодельку, но я, в конце-концов, отказался от такого подхода - он только запутывает, необходимые поля задаются либо напрямую через codebehind, либо через RelativeSource UserControl.

А вот такое:Eld HaspОбщая цепочка привязок такая: "VM UC (VM.VMfromUC) свойство Result" <- "UC tbResult.Text" <- "UC DP-свойство Result" = "View DPCalculatorUC.Result" -> "VM View свойство ResultMain" <- "View TextBlock Run.Text".это слишком суровая жесть, ты и сам в ней разобраться не можешь. Такие цепочки - зло для масштабирования и отладки. Делай всё как можно проще.

Была идея реализовать (в показательных целях) UC для вычисления одной операции над двумя операндами. Список операций и вычисления производятся в VM (с интерфейсом ICalculator). В UC все привязки только к этой своей собственной VM. Эта VM может быть любой и передаётся в UC через DataContext от вышестоящего элемента.

В двух примерах передача данных из VM UC осуществлялась из этой VM.
В третьем хотел показать как замкнуть эту передачу на уровне View через дополнительное внешнее DP-свойство UC чтобы обойтись без явного подключения обработчиков событий в основной VM.

На мой взгляд, я в принципе, и сделал как Вы пишите:

"Юзерконтрол не должен работать в контексте некоей внешней VM (внешнего датаконтекста). Это должен быть автономный модуль, который получает все данные для своей работы через свойства зависимости, определенные на уровне юзерконтрола. Внутри он может использовать свою вьюмодельку"

Вот только не получается так же вернуть полученный результат. Цепочка привязок просто выглядит так ужасно, потому что полностью развёрнуто. Но каждый её кусочек действует независимо от других.

На уровне UC инкапсулирована эта часть "VM UC (VM.VMfromUC) свойство Result" <- "UC tbResult.Text" <- "UC DP-свойство Result" . Всего две привязки - ничего не обычного.

На уровне View также только две привязки "View DPCalculatorUC.Result" -> "VM View свойство ResultMain" <- "View TextBlock Run.Text".

Сделать так: "необходимые поля задаются либо напрямую через codebehind, либо через RelativeSource UserControl"...
Честно говоря не знаю как. По идее список операций и действия по ним измеряемы, и определятся передаваемой локальной VM. Как обойтись без неё - не могу понять.
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39800950
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты одновременно пытаешься установить одно и то же свойство в коде и в XAML
Код: xml
1.
<local:DPCalculatorUC ... Result="{Binding ResultMain, Source={StaticResource VM}}"/>

Код: c#
1.
SetBinding(ResultProperty, bind);
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39800951
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld HaspБыла идея реализовать (в показательных целях) UC для вычисления одной операции над двумя операндами. Список операций и вычисления производятся в VM (с интерфейсом ICalculator). В UC все привязки только к этой своей собственной VM. Эта VM может быть любой и передаётся в UC через DataContext от вышестоящего элемента.Сделай у своего юзерконтрола свойство с типом ICalculator.
Таким образом ты сможешь общаться с моделью калькулятора и из XAML и из codebehind
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39800952
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProТы одновременно пытаешься установить одно и то же свойство в коде и в XAML
Код: xml
1.
<local:DPCalculatorUC ... Result="{Binding ResultMain, Source={StaticResource VM}}"/>

Код: c#
1.
SetBinding(ResultProperty, bind);

Да, пытаюсь. Но не думал что привязка внутри UC будет конфликтовать с привязкой снаружи.
Значит это опять моё недопонимание работы DP-свойств.

А как тогда можно обойти это?
Как связать DataContext.Result, tbResult.Text и UC.ResultMain?
Если нельзя внутри использовать привязку ResultMain, то у меня фантазия иссякает...

Подвесить обработчик PropertyChanged на DatContext? Но что потом делать. Ведь прямое присвоение значения свойству tbResult.Text тоже разрушит привязку.

Чё-то я влез в какой-то тупик...

Или свойство VM Result сделать DP-свойством? Но тогда теряется наглядность...
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39800953
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld HaspДа, пытаюсь. Но не думал что привязка внутри UC будет конфликтовать с привязкой снаружи.
Значит это опять моё недопонимание работы DP-свойств.Это ОДНО И ТО ЖЕ свойство, а не два разных
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39800954
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProEld HaspБыла идея реализовать (в показательных целях) UC для вычисления одной операции над двумя операндами. Список операций и вычисления производятся в VM (с интерфейсом ICalculator). В UC все привязки только к этой своей собственной VM. Эта VM может быть любой и передаётся в UC через DataContext от вышестоящего элемента.Сделай у своего юзерконтрола свойство с типом ICalculator.
Таким образом ты сможешь общаться с моделью калькулятора и из XAML и из codebehind
Да, это не проблема. VM можно получить и из DataContext.

Проблема, как я писал выше, в том как потом записать полученное из VM значение в UI элемент. При прямой записи разрушаются же привязки. Вроде бы...

Надо поэксперементировать.
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39800955
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld HaspА как тогда можно обойти это?Ты сделал неимоверно сложную архитектуру для такой простой задачи.

Как я уже сказал - у тебя есть юзерконтрол для калькулятора и есть модель калькулятора. Поскольку модель калькулятора для юзерконтрола поставляется снаружи - задавай ее через свойство ICalculator юзерконтрола. Таким образом ты сможешь к этой модели обращаться
- из XAML юзерконтрола - через relative source
- из XAML основного окна - через поле основной модели
- из codebegind юзерконтрола через свойство юзерконтрола
- из основной модели - через поле модели
Это будет прозрачно, понятно и без бешеных цепочек байндингов
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39800956
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProEld HaspДа, пытаюсь. Но не думал что привязка внутри UC будет конфликтовать с привязкой снаружи.
Значит это опять моё недопонимание работы DP-свойств.Это ОДНО И ТО ЖЕ свойство, а не два разных
Да, я уже понял. Туплю из-за недопонимания.
Какой-то мультибиндинг, что ли сделать?
Но блин, это, по моему, значительно усложняет пример.
А в голову ничего простого не приходит.
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39800958
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld HaspПроблема, как я писал выше, в том как потом записать полученное из VM значение в UI элемент. При прямой записи разрушаются же привязки. Вроде бы...И фиг бы с ними. Я же говорил - не надо работать изнутри юзерконтрола с датаконтекстом, определенным вне юзерконтрола
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39800959
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld HaspКакой-то мультибиндинг, что ли сделать?
Но блин, это, по моему, значительно усложняет пример.сделай как сказал я, и ты поймешь, насколько всё станет проще
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39800960
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld HaspПроблема, как я писал выше, в том как потом записать полученное из VM значение в UI элемент. При прямой записи разрушаются же привязки. Вроде бы...ВСЕ UI-элементы привяжи к VM, а не друг к другу
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39800965
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProEld HaspА как тогда можно обойти это?Ты сделал неимоверно сложную архитектуру для такой простой задачи.

Как я уже сказал - у тебя есть юзерконтрол для калькулятора и есть модель калькулятора. Поскольку модель калькулятора для юзерконтрола поставляется снаружи - задавай ее через свойство ICalculator юзерконтрола. Таким образом ты сможешь к этой модели обращаться
- из XAML юзерконтрола - через relative source
- из XAML основного окна - через поле основной модели
- из codebegind юзерконтрола через свойство юзерконтрола
- из основной модели - через поле модели
Это будет прозрачно, понятно и без бешеных цепочек байндингов
Ок!
У меня как бы примеры построены по цепочке. В предыдущих темах (в общем цикле) я показывал как сделать этот же калькулятор с использованием INPC в MVVM, конвертеров, WPF команд. Сейчас как бы перехожу от реализации в последней теме к различным способом реализации того же в виде UC.

На предыдущих примерах я показывал как это сделать использую VM UC. В том числе не прямо Ваш вариант, но очень близкий. Может ещё дополню и Вашим вариантом.

На этом примере хотел сделать имеено передачу результата через DP свойство UC. Почему?

Представим теперь следующий шаг-пример (после того который обсуждаем здесь).
Та логика которая сейчас поставляется из подключаемой VM будет инкапсулирована внутри UC (ведь пример учебный и это может быть не обязательно калькулятор). И View ни чего об этой вложенной VM знать не будет. Самое логичное тогда, связать VM и UC через DP свойство UC.

Но, блин! Опять возникает та проблема которую я не могу решить здесь!
Мне придётся или придумывать какое-то решение, или менять план задуманной мною темы.
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39801007
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProEld HaspДа, пытаюсь. Но не думал что привязка внутри UC будет конфликтовать с привязкой снаружи.
Значит это опять моё недопонимание работы DP-свойств.Это ОДНО И ТО ЖЕ свойство, а не два разныхТолько сегодня до меня дошло, что в принципе по алгоритму у свойства UC.Result не должно быть публичного сеттера. Это же свойство для возврата результата, а не его получения.
И тогда сразу всё встаёт на свои места. Так как в View становится невозможным сделать у него привязку. А привязки на него работают нормально.
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39801017
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А есть ли возможность при объявленииDependencyProperty явно указать какие режимы (Mode) привязки можно использовать?
Что бы запретить все кроме OneWayToSource.

Свойство только для чтения DependencyProperty.RegisterReadOnly(...) не подходит, так к нему нельзя сделать ни какую привязку.
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39801020
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вроде бы нет
...
Рейтинг: 0 / 0
Привязка DP-свойства UserControl к вложенному элементу
    #39801024
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал пока так - до большего (если это возможно) пока не додумался.

CB UC
Код: 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.
38.
39.
40.
41.
namespace ConnectionViewWithUC
{

    public class UserControlResultDP : UserControl
    {
        public int? Result
        {
            get { return (int?)GetValue(ResultProperty); }
            set { throw new Exception("An attempt ot modify Read-Only property"); }
        }

        // Using a DependencyProperty as the backing store for Result.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ResultProperty =
            DependencyProperty.Register("Result", typeof(int?), typeof(UserControlResultDP), new PropertyMetadata(null));

        protected int? PART_Result
        {
            get { return (int?)GetValue(PART_ResultProperty); }
            set { SetValue(PART_ResultProperty, value); }
        }

        // Using a DependencyProperty as the backing store for PART_Result.  This enables animation, styling, binding, etc...
        protected static readonly DependencyProperty PART_ResultProperty =
            DependencyProperty.Register("PART_Result", typeof(int?), typeof(UserControlResultDP), new PropertyMetadata(null, ChangeResult));

        private static void ChangeResult(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            d.SetValue(ResultProperty, e.NewValue);
        }
    }
    /// <summary>
    /// Логика взаимодействия для DPCalculatorUC.xaml
    /// </summary>
    public partial class DPCalculatorUC : UserControlResultDP
    {
        public DPCalculatorUC()
        {
            InitializeComponent();
        }
    }
}


XAML UC
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
<local:UserControlResultDP x:Class="ConnectionViewWithUC.DPCalculatorUC"
             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" 
             xmlns:local="clr-namespace:ConnectionViewWithUC" PART_Result="{Binding Result}"
             mc:Ignorable="d" d:DataContext="{x:Type local:ICalculator}" >
    <StackPanel Orientation="Horizontal">
        <TextBox VerticalAlignment="Center" 
                 Text="{Binding First, UpdateSourceTrigger=PropertyChanged}"
                 Margin="5" MinWidth="80"/>
        <ComboBox VerticalAlignment="Center"
                  ItemsSource="{Binding Operators}"
                  SelectedItem="{Binding SelectOperator}"
                  Margin="5" MinWidth="80"/>
        <TextBox Grid.Column="2" VerticalAlignment="Center" 
                 Text="{Binding Second, UpdateSourceTrigger=PropertyChanged}"
                 Margin="5"  MinWidth="80"/>
        <TextBlock Margin="5" VerticalAlignment="Center" Text="="/>
        <TextBox VerticalAlignment="Center" 
                 Text="{Binding Result}" 
                 Margin="5" IsReadOnly="True" MinWidth="80" />
    </StackPanel>
</local:UserControlResultDP>



XAML View
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
<Window x:Class="ConnectionViewWithUC.DPMainView"
        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:ConnectionViewWithUC"
        SizeToContent="WidthAndHeight"
        mc:Ignorable="d" d:DataContext="{x:Type local:DPParentVM}" FontSize="18"
        Title="DPMainView (взаимодействие через DP свойство)">
    <Window.Resources>
        <local:DPParentVM x:Key="VM"/>
    </Window.Resources>
    <Window.DataContext>
        <Binding Mode="OneWay" Source="{StaticResource VM}"/>
    </Window.DataContext>
    <StackPanel>
        <TextBlock Margin="10">
            <Run Text="Результат вычисления:"/>
            <Run Text="{Binding ResultMain}"/>
        </TextBlock>
        <local:DPCalculatorUC DataContext="{Binding VMfromUC, Mode=OneWay}" 
                              Result="{Binding ResultMain, Mode=OneWayToSource, Source={StaticResource VM}}" />
    </StackPanel>
</Window>
...
Рейтинг: 0 / 0
25 сообщений из 38, страница 1 из 2
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Привязка DP-свойства UserControl к вложенному элементу
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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