Windows 商店应用程序的 MultiBinding(WPF) 替代品

MultiBinding(WPF) alternative for Windows Store Apps

我正在开发一个 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 是页面 class 的 属性,而 HeightInMetres 是 Person 类型的视图模型的 属性,它贯穿于包括例如在 ListViews 中使用的 DataTemplates。有一个包含 HeightDisplayUnit 的视图模型实例,但有多个 Person 视图模型实例。

在应用程序的各个位置,我可能会绑定到我想使用的人 谁能想出一种方法来实现触发更新所有 "height" 字段的目的,当 Page 属性 HeightDisplayUnit Person 视图模型的 HeightInMetres 属性 已更新。

在视图模型中添加另一个只读的 属性 很简单。请记住从其他每个属性中提高 "PropertyChanged"。

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

...

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

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

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

您可以将多个运行添加到 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>

有 NuGet 包为 Windows Store apps. You can find documentation here 提供多绑定功能。