繁体   English   中英

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

[英]Can I bind the Height of a XAML Grid back to my C# back end code?

我有一些看起来像这样的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();

将这些值传递给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模式

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

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

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

基于高度进行逻辑的问题:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM