如何在我的绑定中使用转换器而不抛出“FormatException”?

时间:2012-04-16 17:17:08

标签: c# wpf binding ivalueconverter

使用我的转换器抛出'FormatException',并显示消息'输入字符串格式不正确'。在故障排除提示中,它显示“将字符串转换为DateTime时,解析字符串以在将每个变量放入DateTime对象之前获取日期”。这个小费总是会出现吗?因为我没有在转换器中使用DateTime对象,尽管它在MainWindow的其他地方使用。

我的MainWindow中有一个UserControl:

<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;
    }
}

以下是资源字典中的密钥

<local:TPositionToBoolConverter x:Key="TagPosConverter"/>

我会在转换器正常工作时更改代码。我应该提一下,如果我删除转换器,它不会抛出异常。

提前致谢。

更新

我更改了Convert方法的代码,现在返回false而不是"false"。我应该提一下我先退回一个bool,但作为最后的手段,在尝试其他事情后,我试图返回一个字符串,但在写这个问题时忘了改回来。

更新2:

堆栈跟踪:

  

在System.Text.StringBuilder.AppendFormat(IFormatProvider提供程序,   字符串格式,Object [] args)at   System.String.Format(IFormatProvider提供程序,String格式,Object []   args)at   System.Diagnostics.TraceListener.TraceEvent(TraceEventCache   eventCache,String source,TraceEventType eventType,Int32 id,String   format,Object [] args)at   System.Diagnostics.TraceSource.TraceEvent(TraceEventType eventType,   Int32 id,String format,Object [] args)at   MS.Internal.AvTrace.Trace(TraceEventType类型,Int32 eventId,String   message,String [] labels,Object []参数)at   MS.Internal.TraceData.Trace(TraceEventType类型,AvTraceDetails   traceDetails,Object p1,Object p2)at   System.Windows.Data.BindingExpression.UpdateSource(Object value)at   System.Windows.Data.BindingExpressionBase.UpdateValue()at   System.Windows.Data.BindingExpression.SetValue(DependencyObject d,   DependencyProperty dp,Object value)at   System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp,   对象值,PropertyMetadata元数据,布尔值   coerceWithDeferredReference,OperationType operationType,Boolean   isInternal)at   System.Windows.DependencyObject.SetValue(DependencyProperty dp,Object   价值)   System.Windows.Controls.Primitives.ToggleButton.set_IsChecked(Nullable`1   价值)   System.Windows.Controls.Primitives.ToggleButton.OnToggle()at   System.Windows.Controls.Primitives.ToggleButton.OnClick()at   System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonDown(MouseButtonEventArgs   e)在System.Windows.RoutedEventArgs.InvokeHandler(Delegate   处理程序,对象目标)at   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(委托处理程序,对象   目标)在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   在System.Windows.Input.InputManager.ProcessStagingArea()

中受信任

解决方案

我发现了问题。在资源字典中,转换器的密钥应该高于DataTemplate。我认为无论其位置如何,它都会起作用。

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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;     
   } 
} 

答案 2 :(得分:0)

ToggleButton.IsChecked Property等待转换器中的Nullable<bool> / bool?

答案 3 :(得分:0)

拼写出来

 if(value!=null) return true; else return false;