【问题标题】:How to pass a static value to IValueConverter in XAML如何在 XAML 中将静态值传递给 IValueConverter
【发布时间】:2012-08-03 13:40:39
【问题描述】:

我想在我的 WP7 应用程序中使用从网络服务获取的静态文本。每个文本都有一个 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}}"/>

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

有人有什么建议吗?

【问题讨论】:

  • 试试{Binding M62.ValueboxConsent, Converter={StaticResource StaticTextConverter}}
  • 怕不行。

标签: c# windows-phone-7 xaml ivalueconverter


【解决方案1】:

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

总结一下使用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}" />

然后一切都按预期进行!

【讨论】:

    【解决方案2】:

    问题在于您的绑定。它将检查DataContext,并在此对象上尝试评估该对象上的M62 和ValueboxConsent 属性。

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

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

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

    public static class M62
    {
        public static string ValueboxConsent
        {
            get { return "myValueBoxConsentKey"; }
        }
    }
    

    【讨论】:

    • 问题是静态文本非常简单:一个字符串标识一个文本,所有文本都简单地保存在一个长列表中。这就是我使用 LINQ 检索它的原因。但是,我已将我的问题更新为更明确,请再看一下。谢谢!
    • 可以,但是需要绑定正确的值。如果它没有在你的 DataContext 对象上定义,那么你的值将永远是未知的
    • 所以没有办法只传入一些静态字符串?
    • 你可以在你的转换器上添加一个属性,然后像这样传递它:&lt;Helpers:StaticTextConverter x:Name="StaticTextConverter" MyProperty="Value" /&gt;
    【解决方案3】:

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

    Xaml:

    <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;
        }
    }
    

    【讨论】:

    • 这也是我想到的可能性之一。但是,它似乎不起作用。如果我在转换器实现中设置断点,它不会被捕获。我不知道我的转换器设置是否有问题,但我使用的所有其他转换器都工作正常。
    • 它似乎只在&lt;DataTemplate&gt; 中起作用。但是,我也需要它独立工作。有什么建议吗?
    • 无论输入/输出 DataTemplate,这都应该有效。你能提供一个 zip/pastebin 样本吗?
    • 你的答案已经完成了一半。我刚刚发布了一个解决我问题的答案。这是您的问题和另一个问题之间的混合。谢谢。
    【解决方案4】:
    xmlns:prop="clr-namespace:MyProj.Properties;assembly=namespace:MyProj"
    
    <TextBlock Text="{Binding Source={x:Static prop:Resources.MyString}, Converter={StaticResource StringToUpperCaseConverter}}" />
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。 (这个答案进入了“低质量帖子”队列;)..)
    • Mode=OneWay 或 OneTime 如果MyString 是常量,则需要添加到Binding。
    猜你喜欢
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多