【问题标题】:How do you pass data into an IValueConverter in XAML?如何将数据传递到 XAML 中的 IValueConverter?
【发布时间】:2009-07-12 16:13:00
【问题描述】:

我有一个 IValueConverter,它的工作是将 BlockId 转换为 ConditionLabel。问题是我的模型对象具有进行实际转换的聪明才智。到目前为止,我的代码看起来像这样......

public class BlockIdToConditionLabelConverter : IValueConverter
{
    private Model _model;

    public BlockIdToConditionLabelConverter(Model model)
    {
        _model = model;
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        int blockId = (int)value;
        return _model.BlockIdToConditionLabel(blockId);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return Binding.DoNothing;
    }
}

目前,我在这样的 ResourceDictionary 中创建了一个静态资源(稍后在 DataTemplate 中引用它):

<local:BlockIdToConditionLabelConverter
    x:Key="_blockIdToConditionLabelConverter" />

问题是,我需要一种方法将我的模型对象传递给这个转换器。我该怎么做?

谢谢。

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    这是价值转换器的经典问题。

    如果您使用的是 MVVM 模式,则可以通过在模型的 ViewModel 中实现转换来解决该问题。

    如果没有,你可以看看this post on MSDN forums。 (来自 Sam Bent - MSFT 的回答)

    目标是使用多重绑定将模型传递给您的转换器,在这种情况下,传递 DataContext。

    【讨论】:

    • 好吧,现在您让我阅读 MVVM :) 开始使用它对我来说可能很有意义,因为我遇到了该模式似乎想要解决的问题:在哪里我把我的转换器逻辑?我还没有阅读足够的内容来完全理解您所说的“在模型的 ViewModel 中实现转换”的意思。这是否意味着我根本不使用 IValueConverters?或者仅仅是 ViewModel(而不是 XAML 标记)负责实例化它们?谢谢!
    • 我不确定您的模型类是如何实现的。在 MVVM 中,不是将模型作为 WPF 中的 DataContext,而是将 ViewModel 作为 DataContext。我猜您最初是绑定模型的 BlockId 属性。您的 ViewModel 将有一个属性 ConditionLabel,您将绑定它而不是 BlockId。此属性将在 getter 内进行转换。您的 ViewModel 将注册到您的模型的 PropertyChanged,因此您可以在 ViewModel 中 RaisePropertyChange("ConditionLabel")。
    • 我已经阅读了更多关于 MVVM 的内容,所以这开始变得有意义了。我可以将转换后的数据存储在我的 ViewModel 中并完全取消 IValueConverters。但是,一个问题是我计划将此 IValueConverter 与 GridView 一起使用,因此我需要在我的 ViewModel 中存储一整张转换数据表(而不仅仅是单个属性)。 IValueConverter 仍然有意义吗?如果我想将 Block 完全为浅灰色的所有 GridView 单元格变为灰色怎么办?即使我在 ViewModel 中存储了一个“IsComplete”表,我仍然需要将其转换为颜色。
    • 如何在虚拟机内部实现转换?您能否在这个答案中更明确一点(一些示例代码会很有帮助)?
    猜你喜欢
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 2016-09-24
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多