10

我想在我的 WP7 应用程序中使用从 Web 服务获取的静态文本。每个文本都有一个名称(标识符)和一个内容属性。

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

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

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

有人有什么建议吗?

4

4 回答 4

14

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

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

<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. 为了解决这个问题,DataContext只需将控件的属性设置为任意值:

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

然后一切都按预期工作!

于 2012-08-08T07:19:06.863 回答
8

问题在于您的绑定。它将检查DataContext, 并且在这个对象上,它会尝试评估属性M62ValueboxConsent那个对象。

您可能希望在应用程序中可以绑定到的某个位置添加静态键:

<TextBlock Text="{Binding Source="{x:Static M62.ValueboxConsent}", Converter={StaticResource StaticTextConverter}}" />

其中 M62 是您的密钥所在的静态类.. 像这样:

public static class M62
{
    public static string ValueboxConsent
    {
        get { return "myValueBoxConsentKey"; }
    }
}
于 2012-08-03T13:51:48.803 回答
4

如果要使用值转换器,则需要将字符串传递给值转换器的参数

xml:

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

转换器:

public class StaticTextConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (parameter != null)
        {
            return App.StaticTexts.Items.SingleOrDefault(t => t.Name.Equals(parameter)).Content;
        }

        return null;
    }
}
于 2012-08-03T22:05:03.200 回答
3
xmlns:prop="clr-namespace:MyProj.Properties;assembly=namespace:MyProj"

<TextBlock Text="{Binding Source={x:Static prop:Resources.MyString}, Converter={StaticResource StringToUpperCaseConverter}}" />
于 2016-07-18T17:19:17.560 回答