2013-06-21 2 views
0

У меня есть конвертер, который предоставляет значение по умолчанию для пустых строк. По-видимому, вы не можете добавить привязку к ConverterParameter, поэтому я добавляю свойство в конвертер, к которому я привязываюсь.Устранение привязки XAML через код на Windows Phone 8

Однако значение, которое я возвращаю для свойства по умолчанию, представляет собой строку «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}}" /> 

Любые идеи?

ответ

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)); 
... 
... 
+0

Perfect - спасибо! – Gavin

+0

Спасибо за редактирование, извините, что он был отклонен, потому что это было правильное редактирование! –

+0

Не волнуйтесь - я решил бы изменить код, чтобы облегчить жизнь кому-либо еще с той же проблемой;) – Gavin

0

На данный момент я решил проблему, наследуя от моего конвертера и устанавливая локализованную строку в конструкторе. Тем не менее, я считаю, что должно быть более элегантное решение моей проблемы, которое позволяет напрямую использовать базовый конвертер.

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