【问题标题】:Supplying extra context to binding in windows Phone为 Windows Phone 中的绑定提供额外的上下文
【发布时间】:2013-04-16 07:48:08
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# .net windows-phone-8 mvvm


    【解决方案1】:

    如果我理解正确,您在从转换器访问格式化字符串时遇到问题。我认为在模型层中有格式化字符串(与数据表示有关)并不完全是 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 属性。这样的语法意味着我们绑定到整个对象,而不是它的一个属性。

    【讨论】:

    • 是的,这正是我想要做的。但是,此语法不起作用。我收到 System.Windows.Markup.XamlParseException 异常消息:无法分配给属性“System.Windows.Data.Binding.ConverterParameter” 内部消息:由于对象的当前状态,操作无效。我相信我在某处读到这是不可能的,因为参数属性不是依赖属性。
    • 嗯,我基本确定我以前做过。让我检查一下我以前的项目并回复你。
    • 谢谢,但您的第二个解决方案基本上是我在原始问题的第二段中描述的。你有办法避免我列出的两个缺点吗?
    • 重新发布 1:你能更具体一点吗?你在做什么让事情停止工作?重新问题 2:显然无法识别您绑定到的属性,因为您没有绑定到属性。如果将整个视图模型绑定到不同的 UI 对象,则可以为不同的 UI 对象使用不同的转换器。
    • 在第 (1) 点中,我指的是属性更改通知。我的全部绑定点是在数据更改时使视图与模型保持同步。当我尝试这个时,我注意到不再处理通知(处理程序始终为空)。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-11-20
      • 2014-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-25
      • 1970-01-01
      相关资源
      最近更新 更多