通过Windows Phone 8上的代码解析XAML绑定

时间:2013-06-21 03:53:55

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

我有一个转换器,为空字符串提供默认值。显然你不能添加一个绑定到ConverterParameter所以我添加一个属性到转换器,我绑定到。

但是,我为默认属性获取的值是一个字符串“System.Windows.Data.Binding”而不是我的值。

如何在代码中解析此绑定,以便返回我想要的真实本地化字符串?

这是我的转换器类(基于答案https://stackoverflow.com/a/15567799/250254):

public class DefaultForNullOrWhiteSpaceStringConverter : IValueConverter
{
    public object Default { set; get; }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (!string.IsNullOrWhiteSpace((string)value))
        {
            return value;
        }
        else
        {
            if (parameter != null)
            {
                return parameter;
            }
            else
            {
                return this.Default;
            }
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }

}

我的XAML:

<phone:PhoneApplicationPage.Resources>
    <tc:DefaultForNullOrWhiteSpaceStringConverter x:Key="WaypointNameConverter"
        Default="{Binding Path=LocalizedResources.Waypoint_NoName, Mode=OneTime, Source={StaticResource LocalizedStrings}}" />
</phone:PhoneApplicationPage.Resources>

<TextBlock Text="{Binding Name, Converter={StaticResource WaypointNameConverter}}" />

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您应该可以通过继承DependencyObject并将Default属性更改为DependencyProperty来实现此目的。

public class DefaultForNullOrWhiteSpaceStringConverter : DependencyObject, IValueConverter
{
    public string DefaultValue
    {
        get { return (string)GetValue(DefaultValueProperty); }
        set { SetValue(DefaultValueProperty, value); }
    }

    // Using a DependencyProperty as the backing store for DefaultValue.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty DefaultValueProperty =
        DependencyProperty.Register("DefaultValue", typeof(string), 
        typeof(DefaultForNullOrWhiteSpaceStringConverter), new PropertyMetadata(null));
...
...

答案 1 :(得分:0)

现在我已经通过继承我的转换器并在构造函数中设置本地化字符串来解决了这个问题。但是,我觉得我的问题必须有一个更优雅的解决方案,允许直接使用基本转换器。

public class WaypointNameConverter : DefaultForNullOrWhiteSpaceStringConverter
{
    public WaypointNameConverter()
    {
        base.Default = Resources.AppResources.Waypoint_NoName;
    }
}