使用我的转换器会引发“FormatException”,并显示消息“输入字符串的格式不正确”。在疑难解答提示中,它说“将字符串转换为 DateTime 时,在将每个变量放入 DateTime 对象之前解析字符串以获取日期”。这个提示总是出现吗?因为我没有在 Converter 中使用 DateTime 对象,尽管它在 MainWindow 的其他地方使用。
我的主窗口中有一个用户控件:
<local:dCB_Props x:Name="cbTags" Height="23" VerticalAlignment="Top" AddClick="cbTags_AddClick" EditClick="cbTags_EditClick" />
我动态地向它添加项目,其类型是另一个 UserControl,称为 EditDeleteItem。我将它的 DataTemplate 设置为以下之一:
<DataTemplate x:Shared="false" x:Key="TagTemplate">
<StackPanel>
<TextBlock Text="{Binding Path=Label, Mode=TwoWay}"/>
<CheckBox Style="{DynamicResource DaisyCheckBox}" HorizontalAlignment="Left" Content="Isolated">
<CheckBox.IsChecked>
<Binding Path="TagSearchOptions.TagPosition" Converter="{StaticResource TagPosConverter}"/>
</CheckBox.IsChecked>
</CheckBox>
<CheckBox Style="{DynamicResource DaisyCheckBox}" HorizontalAlignment="Left" Content="Match Case" />
<CheckBox Style="{DynamicResource DaisyCheckBox}" HorizontalAlignment="Left" Content="Include" />
</StackPanel>
</DataTemplate>
我的转换器是:
public class TPositionToBoolConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if(value!=null)
{
}
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return TagPosition.Anywhere;
}
}
下面是资源字典中的 Key
<local:TPositionToBoolConverter x:Key="TagPosConverter"/>
当转换器正常工作时,我将更改转换器中的代码。我应该提到,如果我删除转换器,它不会抛出异常。
提前致谢。
更新:
我更改了Convert
方法的代码,它现在返回false
而不是"false"
. 我应该提到我首先返回一个布尔值,但作为最后的手段,在尝试了其他事情之后,我试图返回一个字符串,但在写这个问题时忘记把它改回来。
更新 2:
堆栈跟踪:
在 System.Text.StringBuilder.AppendFormat(IFormatProvider provider, String format, Object[] args) 在 System.String.Format(IFormatProvider provider, String format, Object[] args) 在 System.Diagnostics.TraceListener.TraceEvent(TraceEventCache eventCache,字符串源,TraceEventType eventType,Int32 id,字符串格式,Object[] args) 在 System.Diagnostics.TraceSource.TraceEvent(TraceEventType eventType, Int32 id, String format, Object[] args) 在 MS.Internal.AvTrace.Trace(TraceEventType类型,Int32 eventId,字符串消息,字符串 [] 标签,对象 [] 参数)在 MS.Internal.TraceData.Trace(TraceEventType 类型,AvTraceDetails traceDetails,对象 p1,对象 p2)在 System.Windows.Data.BindingExpression.UpdateSource(对象值)在 System.Windows.Data.BindingExpressionBase.UpdateValue() 在 System。Windows.Data.BindingExpression.SetValue(DependencyObject d, DependencyProperty dp, Object value) at System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, OperationType operationType, Boolean isInternal) at System.Windows.DependencyObject System.Windows.Controls.Primitives.ToggleButton.OnToggle() 的 System.Windows.Controls.Primitives 的 System.Windows.Controls.Primitives.ToggleButton.set_IsChecked(Nullable`1 值) 的 .SetValue(DependencyProperty dp, Object value)。 ToggleButton.OnClick() 在 System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonDown(MouseButtonEventArgs e) 在 System.Windows.RoutedEventArgs.InvokeHandler(委托处理程序,对象目标)在 System.Windows.EventRoute。InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent) at System.Windows.UIElement.OnMouseDownThunk(Object sender, MouseButtonEventArgs e) at System.Windows.RoutedEventArgs .InvokeHandler(Delegate handler, Object target) at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) 在 System.Windows.UIElement.RaiseEvent System.Windows.Input.InputManager.ProcessStagingArea() 处的(RoutedEventArgs args,布尔值信任)RoutedEventArgs args, RoutedEvent newEvent) at System.Windows.UIElement.OnMouseDownThunk(Object sender, MouseButtonEventArgs e) at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target) at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args , Boolean reRaised) at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trust) at System.Windows.Input.InputManager.ProcessStagingArea()RoutedEventArgs args, RoutedEvent newEvent) at System.Windows.UIElement.OnMouseDownThunk(Object sender, MouseButtonEventArgs e) at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target) at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args , Boolean reRaised) at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trust) at System.Windows.Input.InputManager.ProcessStagingArea()InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) 在 System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trust) 在 System.Windows.Input.InputManager。 ProcessStagingArea()InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) 在 System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trust) 在 System.Windows.Input.InputManager。 ProcessStagingArea()
解决方案
我发现了问题。在资源字典中,转换器的键应该在 DataTemplate 之上。我认为不管它的位置如何,它都会起作用。