我可以将XAML网格的高度绑定回我的C#后端代码吗?

时间:2019-03-01 14:50:53

标签: xamarin xamarin.forms

我有一些看起来像这样的XAML代码。它命名了四个网格,然后在后端,我的C#根据值进行操作。由于我不能使用重复的名称,因此我创建了四个名称。

但是我想简化后端代码,所以有可能我可以从XAML> ViewModel绑定回高度值,然后在C#中检查该值

<Grid IsVisible="{Binding AVisible}" VerticalOptions="FillAndExpand">
   <Grid x:Name="aWords" VerticalOptions="FillAndExpand" >
      <Frame VerticalOptions="FillAndExpand">
         <Frame.Content>
            <Grid x:Name="aArea" VerticalOptions="CenterAndExpand">
               <Label Text="{Binding Detail}"
            </Grid>
         </Frame.Content>
      </Frame>
   </Grid>
</Grid>
<Grid IsVisible="{Binding BVisible}" VerticalOptions="FillAndExpand">
   <Grid x:Name="bWords" VerticalOptions="FillAndExpand" >
      <Frame VerticalOptions="FillAndExpand">
         <Frame.Content>
            <Grid x:Name="bArea" VerticalOptions="CenterAndExpand">
               <Label Text="{Binding Detail}"
            </Grid>
         </Frame.Content>
      </Frame>
   </Grid>
</Grid>

和C#

var a = aWords.Height;
var b = aArea.Height;
if (b > a) doSomething();

var c = aWords.Height;
var d = aArea.Height;
if (d > c) doSomething();

我想做的是这样的:

if (vm.AreaHeight > vm.WordsHeight) doSomething();

3 个答案:

答案 0 :(得分:0)

将这些值传递到ViewModel的方法是使用页面的绑定上下文与ViewModel的方法和属性进行交互。

首先,在ViewModel中创建几个属性来保存对象的高度:即:

public int AreaHeight { get; set; }
public int WordsHeight { get; set; }

然后,在页面上覆盖事件: OnAppearing(),以便使用 x:Name 属性从网格中获取“高度”,然后从您的ViewModel方法:doSomething()将获得的值作为参数传递。即:

    protected override void OnAppearing()
    {
        base.OnAppearing();
        // Get your height from your grids here ...
        // int gridAHeight = aWords.Height;
        // int gridBHeight = aArea.Height;
        (BindingContext as YourViewModel).doSomething(gridAHeight, gridBHeight);
    }

最后,在您的ViewModel中,实现doSomething()方法并通过将它们分配给先前创建的属性来捕获从视图页面获得的参数。即:

public void DoSomething(int gridAHeight, int gridBHeight)
{
    AreaHeight = gridAHeight;
    WordsHeight = gridBHeight;
    if (AreaHeight < WordsHeight)
    {
       // place your logic here...
    }
}

这就是您所需要的。这只是基本MVVM模式

答案 1 :(得分:0)

将高度或绑定高度传递到ViewModel违反了MVVM模式。 ViewModels应该对特定视图一无所知。

我建议您重构视图并根据页面所需的具体信息找到其他布局。一种可能的解决方案是使用带有标签的ListView并限制ObservableCollection中的内容,这样您就不会重复。

如果必须以这种方式进行设置,我建议使用MaxLines和/或LineBreakMode来限制标签​​的高度。

关于基于身高的逻辑问题:

  1. FontSize可能会有所不同,具体取决于用户手机中指定的AccessibilitySettings
  2. 旋转屏幕将更改由于标签展开而包裹的标签数量。这将迫使您再次进行重新计算。

答案 2 :(得分:0)

基本上,您不能。 XAML中没有高度,而是HeightRequest。布局是一件复杂的事情,高度可能不会最终等于您的HeightRequest,它只是一个建议值。因此,您只能从视图模型中更改建议值,这不是问题,但这不是您要的。