Я выложил 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 ()».
Спасибо за любую помощь!
Спасибо за ваш ответ. Я не реализовал свойство изменено. Нужно ли мне? Я просто хочу установить это значение 1 раз при загрузке страницы на основе условия (или даже проще без условия и просто установить значение). После этого значение не изменится, поэтому никаких изменений.
Он понадобится вам, чтобы использовать привязку так, как вы пытаетесь. Если вы устанавливаете его сразу в отделенном коде, вы можете попробовать удалить Grid.RowSpan из XAML и установить его только в коде позади, используя x:Name. Что-то вроде Grid.SetRowSpan(MyStackLayout, 4). См. Документы Xamarin для более подробной информации.
Это помогло. Я использовал «FindByName» в макете стека, получил его дескриптор, а затем использовал ваш «Grid.SetRowSpan (...)», чтобы сделать это динамически. Спасибо!





grid, поэтому нет столбцов для охвата StackLayout.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 Отредактировал мой ответ, добавив несколько фрагментов кода с/без ViewModel для привязки к вашему свойству.
Я запутался в использовании «Страницы». Пример стека, который вы привели, имеет «MyStackLayout»; тогда ссылка ("x:Reference...") относится к "Странице". Является ли «Страница» в ссылке источника ключевым словом или это должно читать что-то еще? Как только я сделаю строку bindingcontext в коде программной части, будет ли другая строка для доступа к «MyRowSpanValue = 4» или что-то в этом роде?
Извините, этот x:Name=Page должен быть в верхней части вашего xaml на вашем ContentPage. Поскольку у вас нет виртуальной машины, в коде вашего xaml, когда вы хотите установить MyRowSpanValue, используйте MyRowSpanValue = <value>;, а затем вызовите OnPropertyChanged(nameof(MyRowSpanValue));
Отлично - большое спасибо за помощь (от Андрея в том числе).
Можете ли вы показать остальную часть вашего кода? В частности, нужно посмотреть, реализовано ли INotifyPropertyChanged и используется ли свойство MyRowSpanValue.