为windows Phone中的绑定提供额外的上下文
本文关键字:上下文 绑定 windows Phone | 更新日期: 2023-09-27 18:09:29
我有一个包含两段数据的MVVM模型,一个值(它包含多个值,但我将一次绑定到一个值)和一个显示上下文。显示上下文更像是一个格式化字符串。现在我试图在视图中绑定值,同时使用该显示上下文来正确格式化它。
我已经尝试使用值转换器,但我无法将两个字段都发送给它。我尝试绑定没有一个特定的属性,所以我得到整个模型的值转换器,但这有两个问题:1. 当值改变时通知停止2. 我没有一个很好的方法来确定我们要绑定到哪个属性。
我可以通过在执行格式化的模型上添加一个更智能的属性来解决这个问题,但这需要将值的数量增加一倍,并使模型参与到表示中来。
所以我的问题是:干净利落地解决这个问题的理想方法是什么?如果我理解正确的话,您在从转换器访问格式化字符串时遇到了问题。我认为在模型层中格式化字符串(与数据表示有关)并不完全是MVVM方式。对我来说,你应该把它放到视图模型中。然后,您可以将它像参数一样通过数据绑定传递给转换器。
下面是如何做到这一点的例子:
<TextBlock Text="{Binding Address, Converter={StaticResource AddressToShortOneLinerAddress},ConverterParameter={Binding YourFormattingString}}" TextWrapping="NoWrap" Style="{StaticResource PhoneTextSubtleStyle}"/>
注意ConverterParameter
属性。您可以将它绑定到视图模型的属性,该属性保存格式化字符串。然后您将在Convert
调用中接收它作为object parameter
:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
有帮助吗?还是我完全没听懂你的意思?
编辑:好吧,既然前面的例子不起作用,这里有另一种方法。这个想法基本上是绑定整个DataContext
,并在转换器中将其转换为视图模型类型,并从那里获得格式化字符串。没有那么优雅,但应该可以工作。下面是示例代码,XAML:
<TextBlock Text="{Binding Converter={StaticResource AddressToShortOneLinerAddress}, TextWrapping="NoWrap" Style="{StaticResource PhoneTextSubtleStyle}"/>
…和转换器:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var viewModel = value as MyViewModel;
if (viewModel != null)
{
string format = viewModel.FormattingString;
return ...;
}
return null;
}
请注意我是如何在XAML中遗漏Binding
表达式上的Path
属性的。这样的语法意味着我们绑定到整个对象,而不是它的一个属性。
我最终解决了这个问题,将值和上下文封装到一个属性中,并在值转换器中将其拆分。这允许我保持通知工作,但需要添加额外的类型。