我想在WP7应用程序中使用从Web服务获取的静态文本。每个文本都有一个Name(代表)和一个Content属性。

例如,文本可能如下所示:

Name = "M43";
Content = "This is the text to be shown";

然后,我想将文本的名称(即标识符)传递给IValueConverter,然后它会查询名称并返回文本。

我认为转换器看起来像这样:
public class StaticTextConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value != null)
        {
            return App.StaticTexts.Items.SingleOrDefault(t => t.Name.Equals(value)).Content;
        }

        return null;
    }
}

然后在XAML中:
<phone:PhoneApplicationPage.Resources>
    <Helpers:StaticTextConverter x:Name="StaticTextConverter" />
</phone:PhoneApplicationPage.Resources>

...

<TextBlock Text="{Binding 'M43', Converter={StaticResource StaticTextConverter}}"/>

但是,这似乎不起作用,并且我不确定是否将值正确传递给了转换器。

有人有建议吗?

最佳答案

我终于找到了答案。答案是@Shawn Kendrot和我在这里问的另一个问题之间的混合:IValueConverter not getting invoked in some scenarios

要总结使用IValueConverter的解决方案,我必须将控件绑定(bind)在以下庄园中:

<phone:PhoneApplicationPage.Resources>
    <Helpers:StaticTextConverter x:Name="TextConverter" />
</phone:PhoneApplicationPage.Resources>

<TextBlock Text="{Binding Converter={StaticResource TextConverter}, ConverterParameter=M62}" />

由于文本的ID与转换器参数一起传递,因此转换器看起来几乎是相同的:
public class StaticTextConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (parameter != null && parameter is string)
        {
            return App.StaticTexts.Items.SingleOrDefault(t => t.Name.Equals(parameter)).Content;
        }

        return null;
    }
}

但是,事实证明,如果没有DataContext,则不会调用绑定(bind),因此不会调用转换器。为了解决这个问题,只需将控件的DataContext属性设置为任意值即可:
<TextBlock DataContext="arbitrary"
           Text="{Binding Converter={StaticResource TextConverter}, ConverterParameter=M62}" />

然后一切都按预期工作!

10-06 07:10