【问题标题】:Xamarin Forms Force view to bind valuesXamarin Forms 强制视图绑定值
【发布时间】:2017-02-22 10:15:17
【问题描述】:

我有意见。我在那里有一个可绑定的属性。

public partial class OrderCard : ContentView
{
    public static readonly BindableProperty OrderProperty = BindableProperty.Create(nameof(Order), typeof(Order), typeof(OrderCard), null);

    public Order Order
    {
        get { return (Order)GetValue(OrderProperty); }
        set { SetValue(OrderProperty, value); }
    }

    public OrderCard()
    {
        InitializeComponent();
    }
}

在这个视图的 xaml 中,我绑定到 Order 属性,如下所示:

Text="{Binding Order.Name, Source={x:Reference Root}}"

Root 是视图 OrderCard 的 xaml 中的名称

当我在页面中使用此视图时,一切正常。

但我想在将它添加到页面之前测量它的大小。

var orderCard = new OrderCard { Order = order};
SizeRequest sizeRequest = orderCard.Measure(OrdersContainer.Width/5, OrdersContainer.Height);

但它给了我错误的数字,因为没有应用绑定。 当视图未附加到页面时如何强制应用绑定?

【问题讨论】:

    标签: xamarin xamarin.forms


    【解决方案1】:

    Bindings 不需要附加到 Page 或其他要应用的内容。

    如果您的解决方法是在get_Order 上设置断点,您可能会认为它们没有被应用,因为从未使用过,Xaml 加载程序直接使用GetValue。判断一个 Binding 是否被正确应用的常用方法是在Binding 中添加一个PassthroughConverter(不用找,要自己写),然后在Convert 方法中设置断点.

    话虽如此,你不能Measure 任何东西,除非它被添加到屏幕上呈现的页面。如果您在此之前尝试Measure,您确实会得到虚拟值。

    【讨论】:

    • 不是虚拟值。它正确地测量了一切,但没有应用绑定。为什么我不能在不添加到页面的情况下进行测量? Measure 方法接收它需要测量的所有数据(我说的是视图必须尝试适应的宽度和高度)。但我试图将它添加到页面中(动态创建) - 没有任何改变
    • 查看绑定值的原因是什么?
    • Xaml 加载器在这种情况下无法进行绑定,因为要应用的值是在创建视图之后(在 InitializeComponent 之后)。我需要以某种方式强制视图检查值。因为它不想更新所有东西,它必须这样做,因为这是双向绑定,我设置了一个值,所有绑定都必须填充一个新值
    【解决方案2】:

    我能够通过不执行属性 Order 而是将订单作为 BindingContext 传递来解决此问题。然后我可以测量视图的大小而无需将其附加到这样的页面:

    var orderCard = new OrderCard { BindingContext = order};
    SizeRequest sizeRequest = orderCard.Measure(widthToTryToFitInTheView,heightToTryToFitInTheView);
    

    【讨论】:

      猜你喜欢
      • 2017-06-26
      • 1970-01-01
      • 2021-07-17
      • 2018-03-01
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      相关资源
      最近更新 更多