2012-05-12 18 views
6

Mam blok tekstu, który atrybut Tekst jest wiążący dla DateTime? typ danych i chcę pokazać coś, gdy DateTime? dane mają wartość zerową.
Poniższy kod działa doskonale.
Jak powiązać Zlokalizowany ciąg znaków w atrybucie TargetNullValue?

< TextBlock Text="{Binding DueDate, TargetNullValue='wow,It's null'}"/> 

Ale co, jeśli chcę, aby powiązać Localizedstring do TargetNullValue? ?.
poniższy kod nie działa :(
Jak

< TextBlock Text="{Binding DueDate, TargetNullValue={Binding LocalStrings.bt_help_Title1, Source={StaticResource LocalizedResources}} }"/> 

Odpowiedz

3

aby nie widzę żadnego sposobu, aby to zrobić z TargetNullValue Jako obejście, można spróbować użyć konwertera:

public class NullValueConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value != null) 
     { 
      return value; 
     } 

     var resourceName = (string)parameter; 

     return AppResources.ResourceManager.GetString(resourceName); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Następnie dodać je do zasobów strony:

<phone:PhoneApplicationPage.Resources> 
    <local:NullValueConverter x:Key="NullValueConverter" /> 
</phone:PhoneApplicationPage.Resources> 

Wreszcie go używać zamiast TargetNullValue:

<TextBlock Text="{Binding DueDate, Converter={StaticResource NullValueConverter}, ConverterParameter=bt_help_Title1}" /> 
+0

Po dodaniu wszystkich tych, Error, gdy buduje, { 'lokalne' jest prefiks nierejestrowana.} :( –

+0

to dlatego Miałeś go zadeklarować 'xmlns. Lokalny = "clr-namespace: NamespaceOfYourProject" '(w telefonie: węzeł PhoneApplicationPage na twojej stronie, z innymi xmlns) –

+0

Wielkie dzięki, działa wspaniale! –

1

Ponieważ nie można wiązać wewnątrz innego wiązania, konieczne będzie zastosowanie wielokrotnego wiązania.

Coś jak:

<Window.Resources> 
    <local:NullConverter x:Key="NullConverter" /> 
</Window.Resources> 

<TextBlock> 
    <TextBlock.Text> 
     <MultiBinding Converter="{StaticResource NullConverter}"> 
      <Binding Path="DueDate"/> 
      <!-- using a windows resx file for this demo --> 
      <Binding Source="{x:Static local:LocalisedResources.ItsNull}" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

public class NullConverter : IMultiValueConverter 
{ 
    #region Implementation of IMultiValueConverter 

    public object Convert(object[] values, Type targetType, 
          object parameter, CultureInfo culture) 
    { 
     if (values == null || values.Length != 2) 
     { 
      return string.Empty; 
     } 

     return (values[0] ?? values[1]).ToString(); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, 
           object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
}