编辑:尝试实现转换器时,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
答案 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\}}"