1

使用我的转换器会引发“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 之上。我认为不管它的位置如何,它都会起作用。

4

4 回答 4

1

您的转换器应该返回一个布尔值,而不是一个字符串。

于 2012-04-16T17:21:01.443 回答
0

把它拼出来

 if(value!=null) return true; else return false; 
于 2012-04-16T17:30:53.963 回答
0

ToggleButton.IsChecked 属性等待来自您的转换器的Nullable<bool>/ 。bool?

于 2012-04-16T17:28:56.707 回答
0

您是否尝试过返回布尔对象而不是字符串表示形式?

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;     
   } 
} 
于 2012-04-16T17:22:07.303 回答