2012-04-19 71 views
0

編輯:Gettign XAML分析錯誤試圖執行一個轉換器格式日期時間依賴屬性爲文本(字符串)

錯誤時:上「System.Windows.Markup.StaticResourceHolder」提供價值引發了異常。

<DataTemplate> 
        <myClasses:RegistrationButton x:Name="RegistrationButton" HorizontalAlignment="Center" Height="71" Width="148" 
                Margin="10,0,5,0" 
                Style="{DynamicResource ButtonStyleRegistration}" 
                Click="RegistrationButton_Click" 
                Title="{Binding Title}" 
                Oorzaak="{Binding Oorzaak}" 

                DuurStilstand="{Binding DuurStilstand, 
                 Converter={StaticResource DateTimeConvertor}, 
                 ConverterParameter=\{0:t\}}" 

                BeginStilstand="{Binding BeginStilstand}" 
                /> 
       </DataTemplate> 

IValueConvertor:

public class DateTimeConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     // Retrieve the format string and use it to format the value. 
     string formatString = parameter as string; 
     if (!string.IsNullOrEmpty(formatString)) 
     { 
      return string.Format(culture, formatString, value); 

     } 
     // If the format string is null or empty, simply call ToString() 
     // on the value. 
     return value.ToString(); 
    } 

    // No need to implement converting back on a one-way binding 
    public object ConvertBack(object value, Type targetType, 
     object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

目前我有一個使用綁定和顯示一切正確的String依賴屬性。雖然此屬性應該是DateTime。我在我的應用程序中使用字符串進行計算,而應該使用一個DateTime值來完成此操作。

當我嘗試將此更改爲DateTime時,我什麼也得不到,但綁定錯誤。屬性是String類型之前。

public static readonly DependencyProperty DuurStilstandProperty = 
     DependencyProperty.Register("DuurStilstand", typeof(DateTime), typeof(RegistrationButton), new UIPropertyMetadata("")); 

public DateTime DuurStilstand 
    { 
     get { return (DateTime)GetValue(DuurStilstandProperty); } 
     set { SetValue(DuurStilstandProperty, value); } 
    } 

的XAML綁定:

<TextBlock x:Name="tbDuurStilstand" TextWrapping="Wrap" 
            Text="{Binding DuurStilstand, UpdateSourceTrigger=PropertyChanged}" 
            HorizontalAlignment="Center" 
            VerticalAlignment="Center" 
            Margin="7.5,5,0,0" Height="24.8266666666667"/> 

<ListBox.ItemTemplate> 
       <DataTemplate> 
        <myClasses:RegistrationButton x:Name="RegistrationButton" HorizontalAlignment="Center" Height="71" Width="148" 
                Margin="10,0,5,0" 
                Style="{DynamicResource ButtonStyleRegistration}" 
                Click="RegistrationButton_Click" 
                Title="{Binding Title}" 
                Oorzaak="{Binding Oorzaak}" 
                DuurStilstand="{Binding DuurStilstand}" 
                BeginStilstand="{Binding BeginStilstand}" 
                /> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 

錯誤顯示在此處(XamlParseException):

<myClasses:RegistrationButton x:Name="btnTestRegistration" Content="Test Registratie" HorizontalAlignment="Left" Margin="16.8,0,0,118.14" 
      VerticalAlignment="Bottom" Width="119.2" Height="30.2" FontSize="18.667" Click="btnTestRegistration_Click" Style="{DynamicResource ButtonStyleRegistration}" /> 

爲什麼我無法更改此設置爲DateTime。

該文本塊需要一個字符串,而不是它現在正在獲取的日期時間。當內容被放置在文本塊的.text屬性中時,我如何確保它將DateTime轉換爲字符串?

最好的問候,PeterP

回答

2

在這種情況下,最好的soluiton,在我看來,是使Binding Converters使用,並從綁定的數據。

public class DateTimeConverter: IValueConverter 
{ 
     public object Convert(object value, Type targetType, object parameter, CultureInfo 
     { 

      DateTime dt = (DateTime)value; 
      //convert back to string from dt 

     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      string dateTimeString = value as string; 

      //Convert to DateTime from dateTimeString 
     } 
    } 

定義插件說的App.xaml

<DateTimeConverter x:Key="DateTimeConverter" /> 

並綁定到你的財產

<myClasses:RegistrationButton x:Name="RegistrationButton" HorizontalAlignment="Center" Height="71" Width="148" 
                Margin="10,0,5,0" 
                Style="{DynamicResource ButtonStyleRegistration}" 
                Click="RegistrationButton_Click" 
                Title="{Binding Title}" 
                Oorzaak="{Binding Oorzaak}" 
                DuurStilstand="{Binding DuurStilstand}" 
                BeginStilstand="{Binding BeginStilstand}" 
                Converter = {StaticResource DateTimeConverter } 


         /> 
+0

你好Tigran。這是不是相反的方式轉換爲格式字符串在轉換或我得到這個錯誤?有點困惑什麼在這裏返回(hh:mm:ss)。 – PeterP 2012-04-19 13:42:06

+0

@PeterP:你說得對。剛剛糾正,錯字錯誤..太快了。 – Tigran 2012-04-19 13:49:57

+0

我試着實現,但我得到一個解析錯誤,我不知道是什麼原因。會在帖子頂部張貼一些短代碼。我究竟做錯了什麼?試過今天早些時候實現一個轉換器,但由於xmal解析錯誤,我也失敗了。最好的祝福。 – PeterP 2012-04-19 13:51:28

0

在你的你的財產的定義你的默認值設置爲空字符串。顯然這對DateTime無效!您需要提供一個實際與該屬性類型兼容的默認值。

試試這個:

public static readonly DependencyProperty DuurStilstandProperty = 
    DependencyProperty.Register("DuurStilstand", typeof(DateTime), typeof(RegistrationButton), new UIPropertyMetadata(DateTime.MinValue)); 

您也可以替換爲MINVALUE任何有意義的,因爲你默認的(也許DateTime.Now)。

對於實際格式化日期時,您可以使用StringFormat或轉換器,如其他人所建議的。

編輯

每您的問題與使用轉換器。你需要創建一個轉換器的實例,然後你可以參考它。例如,你可以這樣做:

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

,然後用它是這樣的:

DuurStilstand="{Binding DuurStilstand, 
     Converter={StaticResource MyConverter}, 
     ConverterParameter=\{0:t\}}" 
+0

請您詳細說明一下嗎? – PeterP 2012-04-19 13:27:46

1

我覺得你的問題是在這裏:

public static readonly DependencyProperty DuurStilstandProperty = 
     DependencyProperty.Register("DuurStilstand", typeof(DateTime), typeof(RegistrationButton), new UIPropertyMetadata("")); 

可以使用日期時間,但WPF將需要強制值提供給日期時間,並且您是UIPropertyMetadata([defaultvalue])是一個空字符串,不能被冷卻到DateTime。你應該使用像'UIPropertyMetadata(DateTime.MinValue)。

此外,我建議您將IValueConverter s應用到您的綁定,以便您不依賴WPF來冷卻字符串,這很可能是不可強制的,而是在轉換器中具有一些邏輯來處理適當的事情。

相關問題