Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Blazor - странное присваивание работает

707  
alex445 коренной житель21.07.23 14:55
21.07.23 14:55 
Последний раз изменено 21.07.23 14:57 (alex445)

Точнее не присваивание, а привязывание. Может, особенности Блейзора, а может и вообще... Вобщем, есть компонент со свойством


[Parameter]

public bool Value { get; set; }


Оказывается, я могу в разметке привязать его через рид-онли свойство


определение свойства (самое простое для краткости)

public bool MyValue => true;

привязка в компоненте

Value=@MyValue


а могу через метод


определение метода (самое простое для краткости)

public bool GetMyValue() => true;

привязка в компоненте

Value=@GetMyValue()


Можно ещё проще - сделать названия одинаковыми, чтобы было видно, что разница между этими работающими вариантами прямо минимальная:


public bool MyValue => true;

Value=@MyValue


public bool MyValue() => true;

Value=@MyValue()


Почему с методом работает? Ведь я привязываю свойство Value, и оно должно привязываться к свойству же, а не к методу?

#1 
AlexNek патриот21.07.23 21:52
AlexNek
NEW 21.07.23 21:52 
в ответ alex445 21.07.23 14:55

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

Пример готовый есть? А то ломит пару строк набирать...

#2 
alex445 коренной житель22.07.23 08:54
NEW 22.07.23 08:54 
в ответ AlexNek 21.07.23 21:52
пока в планах другое на выходные.

Катание на доске с парусом? ))


Позже подготовлю. Пока в мыслях лишь то, что рид-онли свойства и методы с лямбдами под капотом во что-то превращаются, что можно так привязывать. Опять сахар синтаксический, который все конвенции рушит. По сути, пофиг, что ты там в языке выучил - главное, что происходит при компиляции в промежуточный язык. Поэтому и всплывают все эти странные поведения.

#3 
AlexNek патриот22.07.23 11:37
AlexNek
NEW 22.07.23 11:37 
в ответ alex445 22.07.23 08:54

Еще ничего не пробовал, только подумалось следующее

https://blazor-university.com/components/two-way-binding/

То есть получается всегда Value = x

#4 
alex445 коренной житель22.07.23 13:45
NEW 22.07.23 13:45 
в ответ AlexNek 22.07.23 11:37

Статья про двунаправленное связывание, а у меня однонаправленное.

#5 
AlexNek патриот22.07.23 13:52
AlexNek
NEW 22.07.23 13:52 
в ответ alex445 22.07.23 13:45

ну так в этом то и дело

отсюда используется только set { get; set; }

Кстати, там есть ссылка и на однонаправленное.

#6 
alex445 коренной житель22.07.23 22:31
NEW 22.07.23 22:31 
в ответ AlexNek 22.07.23 13:52

Да я почитал там всё, и ещё статьи, на которые оно ссылается. Так и не понял. Понял только, что когда интерпретатор Блейзор код разметки разбирает, он там может что угодно наворотить. Поэтому там, где скармливается свойство, иногда можно скормить и метод. Типа он смотрит на список входящих параметров и возврат. И если для какой-то привязки не нужны входящие, а нужен лишь возврат, то ему что свойство, что метод - одно и то же. Как-то так.

#7 
Срыв покровов патриот25.07.23 16:14
NEW 25.07.23 16:14 
в ответ alex445 21.07.23 14:55

видимо потому что в с# для свойств автоматически создаются методы Set и Get.
То есть в любом из твоих примеров вызывается метод . Где-то явно, где-то неявно.

#8 
alex445 коренной житель25.07.23 18:28
NEW 25.07.23 18:28 
в ответ Срыв покровов 25.07.23 16:14

В том же WPF такая фигня не работает - не привяжешь свойство контрола к методу модели.

#9 
AlexNek патриот25.07.23 20:29
AlexNek
NEW 25.07.23 20:29 
в ответ alex445 21.07.23 14:55
Почему с методом работает?

Поставим вопрос по другому. А почему с методом /1way binding/ не должно работать?


В итоге то биндинг преобразовывается к следующему:

builder.AddAttribute(x, "Value", (object)(global::Microsoft.AspNetCore.Components.CompilerServices.RuntimeHelpers.TypeCheck<global::System.Boolean>(MyValue);


#10