2016-05-04 15 views
0

残念です。私は書かなかったこの狂ったWindows Phone 8.1 RT動的アプリを維持しています。これは、DataContextにたくさんのものをロードします。画面に表示されないものは、DataContextを取得していないようです。フォームから離れて移動すると、イベントが発生します。それを解決するために私は何をする必要がありますか?表示にスクロールしても、ロードされません。もし私が上をクリックして戻るボタンをクリックすると、前のページに行く前に、フィールドに値が入力されているのがわかります。アイテムが表示されないためにバインディングが設定されていません

編集 - ここではいくつかのコードです:

 <DataTemplate x:Key="com.somecompany.BarcodeboxRenderer"> 
      <Grid HorizontalAlignment="Stretch" DataContext="{Binding Item1}"> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="auto" /> 
        <RowDefinition Height="*" /> 
       </Grid.RowDefinitions> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="*" /> 
       </Grid.ColumnDefinitions> 
       <TextBlock Text="{Binding Label}" HorizontalAlignment="Stretch" Style="{StaticResource labelstyle}" Grid.Row="0" /> 
       <somecompany:BarcodeBox IsReadOnly="{Binding DisplayOnly}" somecompany:DynamicDataBindingPath.BindingPath="{Binding FieldId}" Grid.Row="1" /> 
      </Grid> 
     </DataTemplate> 

That calls this but only if it's visible: 

    public sealed class DynamicDataBindingPath:FrameworkElement 
    { 
     public static readonly DependencyProperty BindingPathProperty = DependencyProperty.RegisterAttached("BindingPath", typeof(string), typeof(DynamicDataBindingPath), new PropertyMetadata("", OnBindingPathPropertyChanged)); 

     public static string GetBindingPath(FrameworkElement target) 
     { 
      try 
      { 
       return (string)target.GetValue(BindingPathProperty); 
      } 
      catch (Exception) 
      { 
       return string.Empty; 
      } 
     } 

     public static void SetBindingPath(FrameworkElement target, string value) 
     { 
      target.SetValue(BindingPathProperty, value); 
      target.Loaded += Target_Loaded; 
     } 

     private static void Target_Loaded(object sender, RoutedEventArgs e) { 
      var target = (FrameworkElement)sender; 
     if (target is ...) { ... } 
     else if (target is DatePicker) 
     { 
      int startingletterindex = value.IndexOf('.') + 1; 
      string pathtobindto = "obj." + Char.ToUpper(value[startingletterindex]) + value.Substring((startingletterindex + 1)); 
      Binding newbind = new Binding(); 
      newbind.Path = new PropertyPath(pathtobindto); 
      var contextsrc = findRealDataContext(target); 
      newbind.Source = contextsrc.DataContext; 
      newbind.Mode = BindingMode.TwoWay; 
      (target as DatePicker).SetBinding(DatePicker.DateProperty, newbind); 
     } 
     else if (...) 
    } 
+1

あなたが提供したコードは、あなたの質問に答えるには不十分です。 –

+0

あなたの質問のタイトルへの簡単な答えは、表示されていないアイテムにコンストラクタが呼び出され、datacontextプロパティが設定されていることです。リピーター内の項目には、フレームワークによって自動的に設定されたdatacontextプロパティがあるため、最も明白な問題はDataContextの{binding Item1}部分である可能性があります。 –

+0

コントロールが可視でない場合、Target_Loaded(...)イベントが呼び出されません。上にスクロールするとコントロールが表示され、戻るボタンを押すとデータが入力され、前のページに行く前に1秒間表示されます。 – DarrenD

答えて

0

私はListViewコントロールの仮想化の投入とそれが機能するようになりました。私はそれが必要ではないので、一握りの行以上になることはありません。

関連する問題