【问题标题】:MultiBinding(WPF) alternative for Windows Store AppsWindows 应用商店应用的 MultiBinding(WPF) 替代方案
【发布时间】:2016-01-20 22:14:35
【问题描述】:

我正在开发一个 Windows 应用商店应用程序,它在整个应用程序中显示特定类型的字段,并允许用户更改他们对显示该类型字段的单位的偏好。

使用与高度相关的字段示例,如果使用 WPF 中的 MultiBinding(在 WinRT 中不可用),我想做这样的事情:

<Page x:Name="Page" ...>

...

    <TextBlock>
        <TextBlock.Text>
            <MultiBinding Converter={StaticResource HeightConverter}>
                <Binding Path="HeightInMetres"/>
                <Binding Path="HeightDisplayUnit" ElementName="Page"/>
            </MultiBinding>
        </TextBlock.Text>

    </TextBlock>

....

</Page>

HeightUnit 是英尺、米等的枚举。

HeightDisplayUnit 和 HeightInMetres 保存在不同的视图模型中。

在上面的示例中,HeightDisplayUnit 是 Page 类的属性,HeightInMetres 是 Person 类型的视图模型的属性,它始终被绑定,例如在 ListViews 中使用的 DataTemplates 中。有一个包含 HeightDisplayUnit 的视图模型实例,但有多个 Person 视图模型实例。

在应用程序的各个位置,我可能与我想使用的人绑定 当页面属性 HeightDisplayUnit 或 Person 视图的 HeightInMetres 属性时,任何人都可以想出一种方法来实现触发所有“高度”字段更新的目标 -模型已更新。

【问题讨论】:

    标签: windows-runtime windows-store-apps winrt-xaml


    【解决方案1】:

    考虑到您要绑定的数据来自不同的视图模型,将它们合并到一个属性中可能过于复杂,您应该考虑创建一个自定义控件来处理这种情况。

    虽然您仍然无法进行多重绑定,但您将能够公开两个 DependencyProperties 来处理绑定。

    【讨论】:

    • 我已经使用了一个具有 2 个依赖属性和一个值转换器输入的自定义控件。我喜欢该解决方案,因为它以一般方式解决了问题,并适用于格式化值甚至不是远程格式相同的情况。感谢所有回复。
    【解决方案2】:

    在视图模型中添加另一个只读属性很简单。请记住从其他每个属性中引发“PropertyChanged”。

    <TextBlock Text="{Binding FormattedHeight}" />
    

    ...

    public string FormattedHeight
    {
        get { return string.Format("{0} {1}", HeightInMetres, HeightDisplayUnit); }
    }
    

    【讨论】:

    • 感谢您的回复。问题是 HeightDisplayUnit 不是与 HeightInMetres 相同的视图模型的属性。有关详细信息,请参阅修改。
    • @alistairm 我认为这里的两个新答案都是很好的建议,应该可行。
    【解决方案3】:

    有一些 NuGet 包为 Windows Store 应用程序提供 MultiBinding 功能。你可以找到文档here

    【讨论】:

      【解决方案4】:

      您可以将多个 Runs 添加到 1 个文本块并将它们绑定到不同的源:

      <Page.Resources>
          <x:String x:Key="String1">AAA</x:String>
          <x:String x:Key="String2">BBB</x:String>
      </Page.Resources>
      
      <Grid>
          <TextBlock>
              <Run Text="{StaticResource String1}"></Run>
              <Run Text="{StaticResource String2}"></Run>
          </TextBlock>
      </Grid>
      

      【讨论】:

      • 这是一个非常好的建议。如果您不需要控制数据出现的顺序,比我的要简单得多。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-07
      • 2010-09-10
      • 1970-01-01
      • 2012-08-23
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多