1

私のコンバーターを使用すると、「入力文字列が正しい形式ではありませんでした」というメッセージとともに「FormatException」がスローされます。トラブルシューティングのヒントには、「文字列を DateTime に変換するときは、文字列を解析して日付を取得してから、各変数を DateTime オブジェクトに入れる」と書かれています。そのヒントはいつも出てきますか?私はコンバーターで DateTime オブジェクトを使用していないため、MainWindow の他の場所で使用されています。

MainWindow に UserControl があります。

<local:dCB_Props x:Name="cbTags" Height="23" VerticalAlignment="Top" AddClick="cbTags_AddClick" EditClick="cbTags_EditClick" />

動的にアイテムを追加します。そのタイプは、EditDeleteItem と呼ばれる別の UserControl です。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[] 引数) で System.String.Format (IFormatProvider プロバイダー、文字列形式、Object[] 引数) で System.Diagnostics.TraceListener.TraceEvent (TraceEventCache eventCache、 System.Diagnostics.TraceSource.TraceEvent の文字列ソース、TraceEventType eventType、Int32 id、文字列形式、Object[] 引数) (MS.Internal.AvTrace.Trace(TraceEventType) の System.Diagnostics.TraceSource.TraceEvent(TraceEventType eventType、Int32 id、文字列形式、Object[] 引数) System.Windows.Data.BindingExpression.UpdateSource( の MS.Internal.TraceData.Trace(TraceEventType 型、AvTraceDetails traceDetails、オブジェクト p1、オブジェクト p2) の型、Int32 eventId、文字列メッセージ、文字列 [] ラベル、オブジェクト [] パラメーター) System.Windows.Data.BindingExpressionBase.UpdateValue() のオブジェクト値)。Windows.Data.BindingExpression.SetValue(DependencyObject d, DependencyProperty dp, Object value) で System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, OperationType operationType, Boolean isInternal) at System.Windows.DependencyObject .SetValue(DependencyProperty dp, Object value) at System.Windows.Controls.Primitives.ToggleButton.set_IsChecked(Nullable`1 value) at System.Windows.Controls.Primitives.ToggleButton.OnToggle() at System.Windows.Controls.Primitives. System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonDown(MouseButtonEventArgs e) の ToggleButton.OnClick() System.Windows.RoutedEventArgs.InvokeHandler (デリゲート ハンドラー、オブジェクト ターゲット) の System.Windows.EventRoute。System.Windows.UIElement.ReRaiseEventAs(DependencyObject 送信者、RoutedEventArgs args、RoutedEvent newEvent) の InvokeHandlersImpl (オブジェクト ソース、RoutedEventArgs args、Boolean reRaised) .InvokeHandler(デリゲート ハンドラー、オブジェクト ターゲット) で System.Windows.EventRoute.InvokeHandlersImpl(オブジェクト ソース、RoutedEventArgs args、Boolean reRaised) で System.Windows.UIElement.RaiseEventImpl(DependencyObject センダー、RoutedEventArgs args) で System.Windows.UIElement.RaiseEvent System.Windows.Input.InputManager.ProcessStagingArea() で (RoutedEventArgs args、Boolean trusted)System.Windows.UIElement.OnMouseDownThunk (オブジェクト センダー、MouseButtonEventArgs e) の System.Windows.RoutedEventArgs.InvokeHandler (デリゲート ハンドラー、オブジェクト ターゲット) の System.Windows.EventRoute.InvokeHandlersImpl (オブジェクト ソース、RoutedEventArgs args System.Windows.UIElement.RaiseEventImpl(DependencyObject 送信者、RoutedEventArgs args) で System.Windows.UIElement.RaiseEvent(RoutedEventArgs args、Boolean trusted) で System.Windows.Input.InputManager.ProcessStagingArea() で Boolean reRaised)System.Windows.UIElement.OnMouseDownThunk (オブジェクト センダー、MouseButtonEventArgs e) の System.Windows.RoutedEventArgs.InvokeHandler (デリゲート ハンドラー、オブジェクト ターゲット) の System.Windows.EventRoute.InvokeHandlersImpl (オブジェクト ソース、RoutedEventArgs args System.Windows.UIElement.RaiseEventImpl(DependencyObject 送信者、RoutedEventArgs args) で System.Windows.UIElement.RaiseEvent(RoutedEventArgs args、Boolean trusted) で System.Windows.Input.InputManager.ProcessStagingArea() で Boolean reRaised)System.Windows.UIElement.RaiseEventImpl(DependencyObject 送信者、RoutedEventArgs args) の InvokeHandlersImpl (オブジェクト ソース、RoutedEventArgs args、Boolean reRaised) System.Windows.UIElement.RaiseEvent (RoutedEventArgs args、Boolean trusted) の System.Windows.Input.InputManager。 ProcessStagingArea()System.Windows.UIElement.RaiseEventImpl(DependencyObject 送信者、RoutedEventArgs args) の InvokeHandlersImpl (オブジェクト ソース、RoutedEventArgs args、Boolean reRaised) System.Windows.UIElement.RaiseEvent (RoutedEventArgs args、Boolean trusted) の 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 に答える