【问题标题】:Multi binding in UWPUWP 中的多重绑定
【发布时间】:2017-02-18 03:06:48
【问题描述】:

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

这让我有几个选择。

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

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

有没有更好的方法来做到这一点?

【问题讨论】:

  • 对不起,但我似乎不完全明白你在问什么。为什么不直接创建属性(并创建与该属性的绑定),getter 返回您想要的任何内容(例如 return String.Format("{0} and {1}", Equipment.lat, Exuipment.lng);)
  • 是的,这就是我对第三个选项的看法。我显然应该在那里写属性而不是方法......我的问题是是否有办法在 xaml 标记中执行此操作,而不是在我的视图模型中创建属性。
  • 从周年更新开始,x:Bind 支持方法。可以像转换器一样可重用,但像 VM 属性一样易于编写。

标签: xaml uwp uwp-xaml


【解决方案1】:

这可以通过运行来解决。在 UWP 中实现这一点实际上比在 WPF 中的多绑定要容易得多。一个 TextBlock 项目可以由多个“运行”的文本组成,这些文本可以绑定到不同的属性。运行的行为类似于内联元素。每次运行都可以在标签之间直接包含文本,或者作为文本属性。每个 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>

结果是这样的

地点:
纬度:00.000 Lng:00.000

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-10-27
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      • 2017-05-14
      • 1970-01-01
      相关资源
      最近更新 更多