簡體   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