UWP中的多重绑定

时间:2016-10-09 16:05:44

标签: xaml uwp uwp-xaml

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

这给我留下了几个选择。

  1. 创建绑定到每个变量的两个文本块,并将它们彼此相邻对齐。我不确定是否需要两个额外的文本块才能显示" lat"和" lng"在价值观面前。然后是第三个显示" Position"在那之前再次。 This answer声明Binding没有stringformat属性。在我看来,共有五个文本块太多了。
  2.     <RelativePanel>
            <TextBlock x:Name="EquipmentLatTextBox" 
                       Text="{Binding Equipment.lat}"/>
            <TextBlock x:Name="EquipmentLngTextBox"
                       Text="{Binding Equipment.lng}" 
                       RelativePanel.RightOf="EquipmentLatTextBox"/>
        </RelativePanel>
    
    1. 创建值转换器。 这似乎也是非常不必要的。我明白了使用转换器来转换数据类型,但是为了合并字符串,属性中应该有一个构建。

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

    3. 有更好的方法吗?

2 个答案:

答案 0 :(得分:5)

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

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>

结果如下所示

位置:
Lat:00.000 Lng:00.000

答案 1 :(得分:1)

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

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