如何在XAML中将数据传递给IValueConverter?

12

我有一个IValueConverter,它的工作是将BlockId转换为ConditionLabel。问题在于,我的Model对象才具备实际转换的智能。到目前为止,我的代码看起来像这样...

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" />

问题是,我需要一种方法将我的Model对象传递给这个转换器。我该如何做到这一点?

谢谢。

1个回答

7

这是一个具有价值转换器的经典问题。

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

如果不是,您可以查看MSDN论坛上的此帖子。(来自Sam Bent - MSFT的答案)

目标是使用多绑定将模型传递给您的转换器,在本例中传递DataContext。


现在你让我开始阅读MVVM了 :) 对我来说开始使用它可能会很有意义,因为我遇到的问题正是这种模式似乎想要解决的问题:我应该把我的转换逻辑放在哪里?我还没有读足够的内容来完全理解您所说的“在您的模型的ViewModel中实现转换”的含义。这是否意味着我根本不使用IValueConverters?还是只是ViewModel(而不是XAML标记)负责实例化它们的工作?谢谢! - devuxer
1
我不确定你的Model类是如何实现的。在MVVM中,与WPF中将Model作为DataContext不同,您将使用ViewModel作为DataContext。我猜您最初绑定了模型的BlockId属性。您的ViewModel将具有ConditionLabel属性,而不是BlockId进行绑定。此属性将在getter内部执行转换。您的ViewModel将注册到模型的PropertyChanged事件,因此您可以在ViewModel中调用RaisePropertyChange("ConditionLabel")。 - decasteljau
我已经更深入地了解了MVVM,所以这开始变得有意义了。我可以将转换后的数据存储在我的ViewModel中,并完全摆脱IValueConverters。但是有一个问题,我打算将这个IValueConverter与GridView一起使用,因此我需要在我的ViewModel中存储整个转换后的数据表(而不仅仅是单个属性)。对于这种情况,IValueConverter是否仍然有意义?如果我想将所有Block完成的GridView单元格变成浅灰色怎么办?即使我在ViewModel中存储了一个“IsComplete”表,我仍然需要将其转换为颜色。 - devuxer
我该如何在虚拟机内实现转换?您能否更明确地回答这个问题(提供一些示例代码会非常有帮助)? - Phred Menyhert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接