0

我有一个 MVVM 模型,它包含两条数据、一个值(它包含多个,但我将一次绑定到一个)和一个显示上下文。显示上下文更像是一个格式化字符串。现在我试图在使用该显示上下文来正确格式化它的同时绑定视图中的值。

我曾尝试使用值转换器,但无法将两个字段都发送给它。我尝试在没有特定属性的情况下进行绑定,以便在值转换器中获得整个模型,但这有两个问题:1. 值更改时通知停止 2. 我没有一个好的方法来确定我们绑定到哪个属性.

我可以通过在进行格式化的模型上使用更智能的属性来解决这个问题,但这需要将值的数量加倍并让模型参与演示。

所以我的问题是:干净地解决这个问题的理想方法是什么?

4

2 回答 2

0

如果我理解正确,那么您在从转换器访问格式字符串时遇到问题。我认为在模型层中有格式化字符串(与数据表示有关)并不完全是 MVVM 方式。对我来说,你应该把它放到你的视图模型中。然后你可以通过数据绑定将它作为参数传递给转换器。

这是您如何执行此操作的示例:

<TextBlock Text="{Binding Address, Converter={StaticResource AddressToShortOneLinerAddress},ConverterParameter={Binding YourFormattingString}}" TextWrapping="NoWrap" Style="{StaticResource PhoneTextSubtleStyle}"/>

注意ConverterParameter属性。您可以将其绑定到视图模型的属性,该属性包含格式化字符串。然后您将object parameterConvert通话中收到它:

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;
}

请注意我是如何错过了XAMLPath中表达式的属性。Binding这样的语法意味着我们绑定到整个对象,而不是它的一个属性。

于 2013-04-16T09:44:08.093 回答
0

我最终通过将值和上下文封装到一个属性中并将其拆分到值转换器中来解决这个问题。这使我可以保持通知正常工作,但需要添加一个额外的类型。

于 2013-04-22T04:23:42.853 回答