2016-05-27 7 views
4

私はいくつかのアイテムをリストアップして、編集のために別のページに変更するアプリケーションを持っています。編集ページには、別のページにロードするリストから値を選択する必要のあるフィールドがあります。私はモデルとバインディングを更新できるように選択が行われたときに呼び出される編集ページビューモデルからメソッドを渡して、編集ページからリストページを呼び出します。前のページに戻るとUWPアプリケーションがランダムにクラッシュする

問題が

"Error HRESULT E_FAIL has been returned from a call to a COM component." exception. 

で、編集ページに生成されたファイルのApp.gicsでのデバッガ区切りを返すときに時々、それは完全に前に正しいバインディングと選択された値でページを表示するということです壊れた

値リストの非同期読み込みの可能性のあるエラーをダミーページに置き換え、編集ページで設定されたコールバックを削除することで、エラーの可能性を除外しました。エラーはまだ発生しました。 編集ページのナビゲーションキャッシュモードが[必須]に設定されているため、以前の変更は失われません。私は、必要なキャッシュモードなしで試しても、まだエラーが発生しました。

問題を解決するように見えたのは、カスタムコンバーターを編集ページxamlから使用したバインディングを削除したときだけでしたが、他のページのカスタムコンバーターを使用していて問題は発生しませんでした。 DateOffset Converterの

<Page.Resources> 
    <converters:BooleanToVisibilityConverter x:Key="BoolToVisibility" /> 
    <converters:StringFormatConverter x:Key="StringFormat" /> 
    <converters:DateTimeToDateTimeOffsetConverter x:Key="DateOffset" /> 
    <converters:DateTimeToTimeSpanConverter x:Key="TimeSpan" /> 
</Page.Resources> 

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="auto" /> 
     <RowDefinition Height="auto" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <fieldSelectControl:BackButtonAndTitle Title="Page Title" /> 
    <StackPanel Grid.Row="1" Orientation="Horizontal"> 
     <Button Name="HomeButton" 
       Width="70" 
       Height="50" 
       Background="Black" 
       Content="&#xE80F;" 
       FontFamily="Segoe MDL2 Assets" 
       FontSize="30" /> 
     <TextBlock Name="PageTitle" 
        FontSize="36" 
        Text="{Binding OrderTitle}" /> 
    </StackPanel> 
    <ProgressRing Grid.Row="2" IsActive="{Binding IsLoading}" /> 

    <ScrollViewer Grid.Row="2" 
        Height="Auto" 
        HorizontalScrollBarVisibility="Disabled" 
        VerticalScrollBarVisibility="Auto" 
        Visibility="{Binding Path=FinishedLoading, 
             Converter={StaticResource BoolToVisibility}}"> 

     <StackPanel Margin="20,10,20,30"> 
      <TextBlock Margin="0,5,0,5" 
         Style="{StaticResource DetailLabel}" 
         Text="Date" /> 
      <DatePicker Date="{Binding Day, Mode=TwoWay, Converter={StaticResource DateOffset}}" /> 
      <TextBlock Margin="0,15,0,5" 
         Style="{StaticResource DetailLabel}" 
         Text="Type" /> 
      <ComboBox ItemsSource="{Binding ComboValues}" SelectedItem="{Binding SelectedHourType, Mode=TwoWay}" /> 

      <TextBlock Margin="0,15,0,5" 
         Style="{StaticResource DetailLabel}" 
         Text="Start" /> 
      <TimePicker ClockIdentifier="24HourClock" Time="{Binding StartTime, Mode=TwoWay, Converter={StaticResource TimeSpan}}" /> 

      <TextBlock Margin="0,5,0,5" 
         Style="{StaticResource DetailLabel}" 
         Text="End" /> 
      <TimePicker ClockIdentifier="24HourClock" Time="{Binding EndTime, Mode=TwoWay, Converter={StaticResource TimeSpan}}" /> 

      <TextBlock Margin="0,15,0,5" 
         Style="{StaticResource DetailLabel}" 
         Text="Amount" /> 
      <TextBox InputScope="Number" Text="{Binding HValue, Mode=TwoWay}" /> 



      <fieldSelectControl:FieldWithIconSelector x:Name="fsSelect" 
                 IconClickedEvent="btnClose_Click" 
                 IconField="&#xE109;" 
                 TitleField="Add..." 
                 TitleIconField="" 
                 ValueField="" /> 

      <ScrollViewer Height="Auto" 
          HorizontalScrollBarVisibility="Disabled" 
          VerticalScrollBarVisibility="Auto"> 
       <ListView x:Name="lstOrders" 
          Height="auto" 
          MaxHeight="600" 
          HorizontalAlignment="Stretch" 
          IsItemClickEnabled="True" 
          ItemClick="lstOrders_ItemClick" 
          ItemsSource="{Binding SelectedEmployees, 
               Mode=OneWay}"> 
        <ListView.ItemTemplate> 
         <DataTemplate x:DataType="data:Responsible"> 
          <fieldSelectControl:FieldWithIconSelector x:Name="fsEmployees" 
                     IconClickedEvent="fsEmployees_IconClickedEvent" 
                     IconField="" 
                     TitleField="" 
                     TitleIconField="" 
                     ValueField="{Binding Name}" /> 
         </DataTemplate> 
        </ListView.ItemTemplate> 
        <ListView.ItemContainerStyle> 
         <Style TargetType="ListViewItem"> 
          <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
         </Style> 
        </ListView.ItemContainerStyle> 
       </ListView> 
      </ScrollViewer> 
      <Button Name="btnSave" 
        Margin="0,20,0,15" 
        HorizontalAlignment="Stretch" 
        Click="btnSave_Click" 
        Visibility="{Binding Path=FinishedSaving, 
             Converter={StaticResource BoolToVisibility}}"> 
       <Button.Template> 
        <ControlTemplate> 
         <StackPanel HorizontalAlignment="Stretch" 
            VerticalAlignment="Stretch" 
            Background="#0099cc" 
            Orientation="Vertical" 
            Padding="5"> 
          <TextBlock HorizontalAlignment="Center" 
             FontFamily="Segoe MDL2 Assets" 
             FontSize="25" 
             Text="&#xE74E;" /> 
          <TextBlock HorizontalAlignment="Center" Text="Save" /> 
         </StackPanel> 
        </ControlTemplate> 
       </Button.Template> 
      </Button> 
     </StackPanel> 



    </ScrollViewer> 
</Grid> 

コード:

public class DateTimeToDateTimeOffsetConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     try 
     { 
      if (value is DateTime) 
      { 
       DateTime date = (DateTime)value; 
       return new DateTimeOffset(date); 
      } 
      else 
       return new DateTimeOffset(DateTime.Now); 
     } 
     catch (Exception ex) 
     { 
      return new DateTimeOffset(DateTime.Now); 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     DateTimeOffset dto = (DateTimeOffset)value; 
     return dto.DateTime; 
    } 
} 

#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION 
     UnhandledException += (sender, e) => 
     { 
      if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break(); 
     }; 

これは、編集ページのためのXAMLです:

生成されたコードではデバッガのブレークを(更新を参照してください)

TimeOffsetコンバータのコード:

public class DateTimeToTimeSpanConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     try 
     { 
      if (value is DateTime) 
      { 
       DateTime date = (DateTime)value; 
       return new TimeSpan(date.Ticks); 
      } 
      else 
       return new TimeSpan(DateTime.Now.Ticks); 
     } 
     catch (Exception ex) 
     { 
      return new TimeSpan(DateTime.Now.Ticks); 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     TimeSpan ts = (TimeSpan)value; 
     DateTime dt = new DateTime(ts.Ticks); 

     return dt; 
    } 
} 

デバッガが壊れているコードでは、エラーはxaml側にあるようですが、私が述べたように、バインディングでカスタムコンバータを使用する唯一の要素である日付と時刻のピッカーを削除すると思われますそれを修正する。

私には何が欠けていますか?

UPDATE

さらなる試験は、エラーが発生するまで、実際に問題を解決するdoesntのカスタム・コンバータを取り除く、それだけでナビゲーションの数を増加させることが私の注意にもたらしました。私はバインディングを完全に削除しようとしましたが、まだエラーがあります。次のページを呼び出すボタンを除くすべての要素を削除することは機能しているようですが、現時点では、問題が実際に修正されたかどうかは分かりません。

Backボタンを使用して最初のページに移動すると、問題なく機能します。エラーは、Frame.GoBack()が明示的に呼び出された場合にのみ発生します。

+0

内部例外はありますか? – Will

+0

ああ、申し訳ありませんが、メッセージは「不特定のエラー」ですが、実際の例外は「エラーHRESULT E_FAILがCOMコンポーネントの呼び出しから返されました」です。 ErrorCode = -2147467259となります。 Actall内部例外はnullです。 –

+0

''を削除するとうまくいきますか? 'TimeSpan'コンバータのコードを教えてください。 –

答えて

0

例外のこれらの種類は、それらを引き起こしているものへとあまりにも多くのヒントを提供していませんが、あなたは試みることができるいくつかあります:

  • が私の周りlstOrdersからScrollViewerを削除したいです。値を追加することはありませんが、ListViewの仮想化を破り、誤ってlstOrdersに設定したMaxHeightを削除した場合は、メモリとCPUを任意に使用しようとします。
  • btnSaveテンプレートは、対話的なフィードバック要素を削除するため、悪いです。
  • バインドするプロパティがUI /ディスパッチャスレッドから変更されていないことを確認してください。
+0

「ScrollViewer」のヒントをありがとう。 'ScrollViewer'、 'btnSave'テンプレートを削除し、バインドされたプロパティをダブルチェックしました。これのどれも働かなかった。プロパティはUIスレッドで変更されていますが、変更されていなくても例外が発生します。 –

+0

次に、私が考えている最良の方法は、削除を試みることです。クラッシュを止めるまで、コードを削除してください。また、クラッシュの直前に呼び出されるかどうかを確認するために、いくつかのトレース呼び出しをコンバーターに追加することもできます。 –

+0

とにかくプロパティに変更が加えられていないため、クラッシュが発生しなくてもコンバーターは呼び出されません。 編集した質問に新しい情報と修正があります。 –

0

質問のコメントに記載されているとおり、私は今日この問題を経験しています。この問題をTimePickerコントロール、より具体的には、コントロールのTimeプロパティでの双方向バインディングに分離するのは比較的簡単です。

しかし、それが起こっていた理由を理解するのはあまり簡単ではありませんでした。可視性(私のアプリをバックグラウンドに移動する際に問題が発生する)を回避し、バインドされた値を更新することは、いくつかの問題のようです。それにもかかわらず、私は役に立たないさまざまなことを試みた。

最後に、従来の{Binding}の構文をコンパイル済みの{x:Bind}に変更しようとしましたが、幸いにも問題は解決しませんでした。

おそらく、そのショットを与えて、それがあなたの問題を解決するかどうかを確認してください。明らかに、TimePickerは、データ型固有の、または私の場合のように、カスタム依存プロパティを持つユーザーコントロールを持つDataTemplateの内部にある必要があります。

関連する問題