UWP 中的多重绑定

Multi binding in UWP

我想显示带有纬度和经度的文本块。在我的模型中,lat 和 lng 是两个变量,所以我需要将它们组合起来,最好使用 this answer 建议的 stringformat。不幸的是,UWP 应用程序似乎不支持多重绑定。

这让我有几个选择。

  1. 创建两个绑定到每个变量的文本块,并将它们并排对齐。我不确定我是否需要两个额外的文本块才能在值前面显示 "lat" 和 "lng"。然后第三个标签再次显示 "Position" 。 声明没有用于绑定的字符串格式 属性。我认为一共五个文本块太多了。
    <RelativePanel>
        <TextBlock x:Name="EquipmentLatTextBox" 
                   Text="{Binding Equipment.lat}"/>
        <TextBlock x:Name="EquipmentLngTextBox"
                   Text="{Binding Equipment.lng}" 
                   RelativePanel.RightOf="EquipmentLatTextBox"/>
    </RelativePanel>
  1. 创建一个值转换器。 这也显得很没有必要。我明白了使用转换器来跨数据类型进行转换的意义,但是对于连接字符串,应该在 属性.

  2. 中有一个构建
  3. 在视图模型中创建一个属性,returns应该显示的值的字符串。这似乎是最佳选择,因为该方法不在模型中,但我仍然认为我应该能够在 xaml 标记中执行此操作。

有更好的方法吗?

不,通用 Windows 平台目前不支持多重绑定。对您来说最好的解决方案确实是 在视图模型中创建一个专用的 属性 或者使用两个 TextBox 控件。与 WPF 相比,UWP 中的绑定语法受到更多限制,以确保最佳性能。

您还可以考虑使用 x:Bind 语法来确保强类型和优化的绑定,这是随 UWP 引入的。

这可以通过使用 运行s 来解决。在 UWP 中实现这一点实际上比在 WPF 中使用多重绑定要容易得多。一个 TextBlock 项可以包含多个 "runs" 文本,这些文本可以绑定到不同的属性。 运行s 将表现得像内联元素。每个 运行 可以在标签之间直接包含文本,或者作为文本 属性。每个 运行 元素也可以有独立的样式。

Documentation for the TextBlock class

对于我在问题中提供的示例,我最终将其格式化为这样

<TextBlock x:Name="LocationTextBlock">
    <Run FontWeight="Bold">Location: </Run>
    <LineBreak />
    <Run>Lat: </Run>
    <Run Text="{x:Bind ViewModel.Equipment.Lat}"></Run>
    <Run> Lng: </Run>
    <Run Text="{x:Bind ViewModel.Equipment.Lng}"></Run>
</TextBlock>

结果是这样的

地点:
纬度:00.000 经度:00.000