Как я могу установить размер строки стека в сетке?

Я выложил XML-страницу в Xamarin.Forms, которая имеет "stacklayout" в "сетке". Я хочу программно установить/изменить высоту строки сетки.

Мой XML:

<Grid x:Name = "outerGrid">
    <StackLayout x:Name = "MyStackLayout" Grid.Row = "5" Grid.RowSpan = "{Binding MyRowSpanValue}" Grid.Column = "0">
        <!-- labels/buttons are added here in code-behind -->
    </StackLayout>
</Grid>

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

if (somevar == 2)
    MyRowSpanValue = 5
else
    MyRowSpanValue = 10

Что такое код С# для этого? Мой не работает, даже пытался поместить это в переопределение «OnAppearing ()».

Спасибо за любую помощь!

Можете ли вы показать остальную часть вашего кода? В частности, нужно посмотреть, реализовано ли INotifyPropertyChanged и используется ли свойство MyRowSpanValue.

Andrew 30.04.2019 17:18

Спасибо за ваш ответ. Я не реализовал свойство изменено. Нужно ли мне? Я просто хочу установить это значение 1 раз при загрузке страницы на основе условия (или даже проще без условия и просто установить значение). После этого значение не изменится, поэтому никаких изменений.

Donna 30.04.2019 17:55

Он понадобится вам, чтобы использовать привязку так, как вы пытаетесь. Если вы устанавливаете его сразу в отделенном коде, вы можете попробовать удалить Grid.RowSpan из XAML и установить его только в коде позади, используя x:Name. Что-то вроде Grid.SetRowSpan(MyStackLayout, 4). См. Документы Xamarin для более подробной информации.

Andrew 30.04.2019 18:04

Это помогло. Я использовал «FindByName» в макете стека, получил его дескриптор, а затем использовал ваш «Grid.SetRowSpan (...)», чтобы сделать это динамически. Спасибо!

Donna 30.04.2019 18:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
399
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. Вам нужно правильно установить BindingContext. Если у вас есть модель представления, вам нужно будет установить источник привязки в xaml как вашу страницу, чтобы она могла найти свойство.
  2. Вы не указываете какие-либо столбцы в своем grid, поэтому нет столбцов для охвата StackLayout.
  3. Если это находится в вашем коде за файлом xaml, вам не нужно реализовывать INotifyPropertyChanged. Просто позвони OnPropertyChanged(nameof(MyRowSpanValue))

РЕДАКТИРОВАТЬ

При использовании ViewModel:

Сначала вам понадобится x:Name = "Page" или любое другое имя, которое вы хотели бы назвать своей страницей. Тогда код для ссылки на него будет выглядеть следующим образом:

<StackLayout x:Name = "MyStackLayout"
             Grid.Row = "5"
             Grid.RowSpan = "{Binding MyRowSpanValue, Source = {x:Reference Page}}"
             Grid.Column = "0">
        <!-- labels/buttons are added here in code-behind -->
</StackLayout>

Не использовать ViewModel

В конструкторе страницы установите BindingContext=this;, и тогда xaml/page будет искать в вашем коде свойство MyRowSpanValue.

public YourConstructor()
{
    BindingContext = this; // Code behind will be binding context for XAML
}

Если вы хотите изменить значение свойства (используется для обеих ситуаций)

public int MyRowSpanValue { get; set; }

// When you want to change the MyRowSpanProperty
public void ChangeTheValue()
{
    MyRowSpanValue = 3; // Or whatever value you are wanting
    OnPropertyChanged(nameof(MyRowSpanValue));
}

Я ценю ваш ответ. Я не использую здесь модель представления, но я попытался установить BindingContext, но не был уверен, что он должен быть установлен. Согласно приведенному выше ответу, я смог выполнить то, что мне было нужно, но мне был бы очень интересен фактический код, чтобы установить правильный контекст в этом сценарии для дальнейшего использования.

Donna 30.04.2019 18:41

@Donna Отредактировал мой ответ, добавив несколько фрагментов кода с/без ViewModel для привязки к вашему свойству.

TaylorD 30.04.2019 20:05

Я запутался в использовании «Страницы». Пример стека, который вы привели, имеет «MyStackLayout»; тогда ссылка ("x:Reference...") относится к "Странице". Является ли «Страница» в ссылке источника ключевым словом или это должно читать что-то еще? Как только я сделаю строку bindingcontext в коде программной части, будет ли другая строка для доступа к «MyRowSpanValue = 4» или что-то в этом роде?

Donna 30.04.2019 20:53

Извините, этот x:Name=Page должен быть в верхней части вашего xaml на вашем ContentPage. Поскольку у вас нет виртуальной машины, в коде вашего xaml, когда вы хотите установить MyRowSpanValue, используйте MyRowSpanValue = <value>;, а затем вызовите OnPropertyChanged(nameof(MyRowSpanValue));

TaylorD 30.04.2019 20:58

Отлично - большое спасибо за помощь (от Андрея в том числе).

Donna 30.04.2019 22:02

Другие вопросы по теме