Blazor - странное присваивание работает
Точнее не присваивание, а привязывание. Может, особенности Блейзора, а может и вообще... Вобщем, есть компонент со свойством
[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, и оно должно привязываться к свойству же, а не к методу?
Да очень странно, надо разбираться, но пока в планах другое на выходные.
Пример готовый есть? А то ломит пару строк набирать...
пока в планах другое на выходные.
Катание на доске с парусом? ))
Позже подготовлю. Пока в мыслях лишь то, что рид-онли свойства и методы с лямбдами под капотом во что-то превращаются, что можно так привязывать. Опять сахар синтаксический, который все конвенции рушит. По сути, пофиг, что ты там в языке выучил - главное, что происходит при компиляции в промежуточный язык. Поэтому и всплывают все эти странные поведения.
Еще ничего не пробовал, только подумалось следующее
https://blazor-university.com/components/two-way-binding/
То есть получается всегда Value = x
Статья про двунаправленное связывание, а у меня однонаправленное.
ну так в этом то и дело
отсюда используется только set { get; set; }
Кстати, там есть ссылка и на однонаправленное.
Да я почитал там всё, и ещё статьи, на которые оно ссылается. Так и не понял. Понял только, что когда интерпретатор Блейзор код разметки разбирает, он там может что угодно наворотить. Поэтому там, где скармливается свойство, иногда можно скормить и метод. Типа он смотрит на список входящих параметров и возврат. И если для какой-то привязки не нужны входящие, а нужен лишь возврат, то ему что свойство, что метод - одно и то же. Как-то так.
видимо потому что в с# для свойств автоматически создаются методы Set и Get.
То есть в любом из твоих примеров вызывается метод . Где-то явно, где-то неявно.
В том же WPF такая фигня не работает - не привяжешь свойство контрола к методу модели.
Почему с методом работает?
Поставим вопрос по другому. А почему с методом /1way binding/ не должно работать?
В итоге то биндинг преобразовывается к следующему:
builder.AddAttribute(x, "Value", (object)(global::Microsoft.AspNetCore.Components.CompilerServices.RuntimeHelpers.TypeCheck<global::System.Boolean>(MyValue);
