如何在网格中设置堆栈布局的行跨大小?

时间:2019-04-30 15:05:10

标签: c# xml xamarin.forms

我已经在Xamarin.Forms中布置了一个XML页面,该页面在“网格”中具有一个“ 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

要执行此操作的C#代码是什么?我的机器无法正常工作,甚至尝试将其放入“ OnAppearing()”替代中。

感谢您的帮助!

1 个答案:

答案 0 :(得分: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 /页面将在代码中查找 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));
}