格式DateTime依赖项属性为文本(String)

时间:2012-04-19 13:22:12

标签: c# .net wpf xaml

编辑:尝试实现转换器时,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 Dependency属性,它使用绑定并显示正确的一切。虽然此属性应该是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。

textblock需要一个String而不是它当前正在获取的DateTime。当内容放在文本块的.text属性中时,我究竟如何确保将DateTime转换为String?

最好的问候,PeterP

4 个答案:

答案 0 :(得分:2)

在这种情况下,我认为最好的解决方案是在绑定数据中使用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 
        }
    }

定义ins说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 }


                        />

答案 1 :(得分:1)

好吧,当你谈论转换(从DateTime到string)时,你只需在绑定中添加 IValueConverter 即可。以下MSDN文章有一个示例,演示如何从DateTime转换为字符串:

http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter(v=vs.95).aspx

答案 2 :(得分:1)

我认为你的问题在这里:

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

您可以使用DateTime,但WPF需要强制提供给DateTime的值,而您UIPropertyMetadata([defaultvalue])是一个空字符串,不能与DateTime相关联。你应该使用像'UIPropertyMetadata(DateTime.MinValue)。

这样的东西

另外,我建议您将IValueConverter应用于绑定,这样您就不会依赖WPF来伪造字符串,这很可能是不可强制的,而是在其中有一些逻辑。转换器适当地处理事情。

答案 3 :(得分: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\}}"